点语法
点语法的本质是方法调用:调用对象成员变量的setter和getter
是编译器特性,编译器帮忙转的
p.age = 25; // 等价于 [p setAge:25];
int a = p.age; // 等价于 int a = [p age];
// 访问成员变量不能用点语法,而是
p->_age;
属性(实例变量\成员变量)的作用域
@public 在任何地方都能利用对象直接访问该对象的成员变量 p->_age=25;
@protected(默认—在@interface中声明) 能在当前类和子类的对象方法中直接访问
@private(默认—在@implementation中声明) 只能在当前类的对象方法中直接访问
类方法不能访问成员变量,因为类方法是通过类名调用,不依赖于对象;成员变量是在创建了对象的基础上才有。
在.h文件@interface中声明的成员变量默认是@protected------在.m文件@implementation中写的成员变量就是@private
@interface和@implementation中不能声明同名的成员变量
@property与@synthesize
.h文件
@property 可以自动生成某个成员变量的setter和getter的声明
@property int age;
@property NSString *name;
.m文件
@synthesize 自动生成@property中age的setter和getter的实现,并且访问的是_age这个成员变量
@synthesize age=_age;
@synthesize name=_name;
上面两行等价于
@synthesize age=_age, name=_name; // 会访问_age和_name这2个成员变量;如果这2个成员变量不存在(没有在.h文件@interface中声明),会自动生成@private类型的成员变量_age和_name
Xcode现在的版本不需要再在.m文件中写@synthesize了;
只需要在.h文件中@property int age;
编译器会自动生成@private的成员变量int _age 同时生成setter、getter的声明与实现
id
id 是一种数据类型---万能指针,能指向\操作任何OC对象
id相当于NSObject *
id类型的定义:
typedef struct objc_object{
Class isa;
} *id;
构造方法—用来初始化对象的方法(- init、- initWithxxx)
一、重写构造方法
完整地创建一个 可用的 对象 [Person new],new方法中会调用下面2个方法
1> 分配存储空间 + alloc 返回一个分配好存储空间的 不可用 对象(还没初始化)
2> 初始化 - init (这个初始化太死板,开发中一般自己写构造方法初始化- initWithxxx,所以一般不用+ new)
重写构造方法的目的:为了让对象创建出来,成员变量有些固定的值
重写构造方法注意:在类的.m文件中重写- init方法
1> 先调用父类的构造方法[super init];
2> 再进行子类内部成员变量的初始化
// 重写构造方法init
- (id)init
{
// 1> 一定要先调用父类的- init方法:(初始化父类中声明的一些成员变量和其他属性)
self = [super init]; // 返回 当前对象 self
// 2> 如果对象初始化成功,才有必要接来下成员变量的初始化
if (nil != self) // 0 != self nil为0
{
// 初始化成功
_age = 3; // 在这里初始化成员变量(初始化当前对象的成员变量)
}
// 3> 返回一个初始化完的对象
return self;
}
// 简化———重写后的构造方法init
- (id)init
{
if (self = [super init])
{
_age = 5; // 在这里初始化成员变量(初始化当前对象的成员变量)
}
return self;
}
二、自定义构造方法
/*
自定义构造方法的规范
1> 一定是对象方法,以 - 开头
2> 返回值一般是id类型
3> 方法名一般以initWith开头
*/
- (id)initWithName:(NSString *)name
{
if ( self = [super init] )
{
_name = name;
}
return self;
}
Category ()
Category分类、类别、类目:
可以给某个类扩充一些方法---不修改原来类
1> 声明 .h文件
@interface 要增加分类的类名 (分类名称)
@end
2> 实现 .m文件
@implementation 要增加分类的类名 (分类名称)
@end
注:
1> 分类 只能增加方法,不能增加成员变量
2> 在分类中增加的方法可以访问原来类中声明的成员变量
3> 分类可以重新实现(覆盖)原来类中的同名方法,会导致原来的方法失效(不建议在分类中写与原来类同名的方法,因为会覆盖原来的方法)
4> 方法调用的优先级:分类(最后编译的分类优先)>原来类>父类