属性
1、属性的参数应该按照下面的顺序排列: 原子性,读写 和 内存管理。(nonatomic, readwrite, copy)
2、修饰符被修改的可能性从高到底应为:内存管理 > 读写权限 >原子操作
3、原子操作 --在iOS中,atomic带来的锁特别影响性能。建议使用nonatomic
4、读写权限--为了完成一个共有的 getter 和一个私有的 setter,你应该声明公开的属性为 readonly 并且在类扩展中重新定义通用的属性为 readwrite 的
5、内存管理--为了让它存活到定义的块的结束,必须使用 copy (block 最早在栈里面创建,使用 copy让 block 拷贝到堆里面去)
6、@property (assign, getter=isEditable) BOOL editable;
7、描述BOOL属性的词如果是形容词,那么setter不应该带is前缀,但它对应的 getter 访问器应该带上这个前缀
8、可变的对象设置的((比如 NSString,NSArray,NSURLRequest))属性的内存管理类型必须是 copy。这是为了确保防止在不明确的情况下修改被封装好的对象的值(译者注:比如执行 array(定义为 copy 的 NSArray 实例) = mutableArray,copy 属性会让 array 的 setter 方法为 array = [mutableArray copy], [mutableArray copy] 返回的是不可变的 NSArray 实例,就保证了正确性。用其他属性修饰符修饰,容易在直接赋值的时候,array 指向的是 NSMuatbleArray 的实例,在之后可以随意改变它的值,就容易出错)。
9、你应该同时避免暴露在公开的接口中可变的对象,因为这允许你的类的使用者改变类自己的内部表示并且破坏类的封装。你可以提供可以只读的属性来返回你对象的不可变的副本。
实例变量
@property语法定义出来的实例的成员变量(apple官方文档称之为ivars)是property名前冠以下划线为变量名定义的
@property自动帮你定义setter和getter方法
@property实例的成员变量ivars
实例变量的语法是在property语法定义的变量名前加下划线
实例变量名与property名相同
self.title 形式试图访问及修改实例变量 其实也是经过了accessor方法中转来完成的
----------------------------------------------
@property 的本质是什么?
@property = ivar (实例变量) + getter + setter (access method = getter + setter);
自动向类中添加适当类型的实例变量: _属性名
@synthesize 语法来指定实例变量的名字