点语法(编译器特性)
原理,点语法的本质还是方法调用
1,实用举例
- (void)setAge:(int)age
{
NSLog(@"setAge:");
// 会引发死循环
self.age = age; // 相当于[self setAge:age];
}
- (int)age
{
NSLog(@"age");
// 会引发死循环
return self.age; // 相当于[self age];
}
2,成员变量的作用域
@public 在任何地方都能直接访问对象的成员变量
@private 只能在当前类的对象方法中直接访问(在.m文件里创建成员变量默认是@private)
@protected 能在当前类和子类的对象方法中直接访问 (在.h文件里默认就是@proteced)
@package 只要处在同一个框架中,就能直接访问对象的成员变量 (一般用不到)
@implementation 中不能定义和@interface中同名的成员变量
只在@implementation写类成员和方法也是可以的,不过一般不这样写,
3,继承补充
父类\超类 superclass
子类继承父类所有成员变量,不管是私有还是公有
Objective c为单继承
@property和@synthesize(编译器特性)
原理,
@property:可以自动生成某个成员变量的setter和getter声明
@synthesize: 可以自动生成成员变量的setter和getter的实现,并且会访问_成员变量。
1,简单写法
(1), 相同类型的时候可以写在一起,例如
@property int speed,wheels;
(2),用@property的时候成员变量可以省略。自动生成成员变量,默认前面加符号下划线_。
(3),用@property的时候@synthesize也可以省略。自动在@implementation生成set和get的实现。
只用@property创建的成员变量默认是私有的,如果要在子类里面用到成员变量,只能明显的在interface里面写上成员变量,注意前面加上下划线_.
2,细节注意
(1)@synthesize age = _age
> seter和getter实现中访问的成员变量是_age,如果_age不存在,就会自动生成一个@private的成员变量age
(2)@synthesize age
> seter和getter实现中默认访问age成员变量而不是_age,如果成员变量age不存在,就会自动生成一个@private的成员变量age.
3,手动实现
(1),若手动实现了setter方法,编译器就只会自动生成getter方法
(2),若手动实现了getter方法,编译器就只会自动生成setter方法
(3),若同时手动实现setter和getter方法,编译器就不会自动生成不存在的成员变量。
1,property中set方法内存管理相关的参数
(1),retain : release旧值,retain新值(适用于OC对象类型)
(2),assign : 直接赋值(默认,适用于非OC对象类型)
(3),copy : release旧值,copy新值
2,是否要生成set方法
(1),readwrite : 同时生成sette和getter的生命、实现
(2),readonly : 只会生成getter的声明、实现
3,多线程管理
> nonatomic : 性能高(一般就用这个)
> atomic : 性能低(默认)
4,setter和getter方法的名称
(1),@property (getter = abc,setter = aetAbc:)int weight;// setter方法的名称一定要有个冒号:
(2),常用语BOOL类型成员,例如@property (getter = isRich) BOOL rich;