1、在类接口中声明实例变量 意味着对象布局在编译器就已经固定。只要访问该实例,编译器就把它替换成“偏移量”,如果增加新的实例变量会导致偏移量出错,需重新编译。 声明为属性,偏移量会在运行时查找。
2、通过属性特质来指定存储数据所需的正确语义(分为4大类)
2.1.原子性
// 由于历史原因,atomic会造成iOS上性能问题,一律用nonatomic。在者atomic事实上也无法保证线程安全
@property(nonatomic, readonly, getter=isViewLoaded) BOOL viewLoaded
// 2.2.读写权限:readonly只读,readwrite读写(默认值)
@property(nonatomic, readonly, getter=isViewLoaded) BOOL viewLoaded
/**
* 2.3.内存管理语义
* assgin: ”纯量类型“
* strong: "拥有关系",先保留新值,释放旧值,设置新值
* weak: "非拥有关系",属性所指的值遭到销毁,属性值也会清空
* unsafe_unretained: 语义和assign相同,当目标对象遭到摧毁时,属性值不会清空
* copy: strong类似。不保留新值,保留其拷贝。源对象不可变还是用strong吧。
*/
/**
* 2.4.指定存取的方法名: 属性是Boolean型时常用
*/
@property(nonatomic, readonly, getter=isViewLoaded) BOOL viewLoaded
3.设置属性对应的实例变量时,一定要遵从属性所声明的语义。