属性与实例变量的区别:
属性无法直接访问对象的内部状态,但提供了访问这类数据的的方便机制
1.属性声明
语法:
@property (特性) 属性类型 属性名称;
作用:
声明会设置与属性关联的getter/setter方法的特性,但无法生成真正的方法定义
特性:
2.属性定义
包括:getter方法和setter方法的定义,实例变量的声明,并在getter/setter方法中使用这个实例变量
定义属性的方式:
a.显示定义:
getter/setter方法必须遵循其命名规则,实例变量应该遵循其命名惯例
b.通过关键字补全:
语法:@synthesize 属性名称 [= 实例变量名称];
说明:[= 实例变量名称]为可选项。
若缺省,则编译器根据命名惯例自动生成实例变量名称,否则,编译器使用该实例变量名称。
c.动态生成
略
d.自动补全
编译器可以自动补全以下已声明的属性:
1).没有使用关键字补全的属性
2).不是动态生成的属性
3).没有用户编写getter和setter方法的属性
3.由属性支持的实例变量
命名惯例:实例变量的名称是属性名称前加下划线
4.属性的访问/设置
两种机制:访问器/设置器方法,点语法。
a.访问器/设置器方法:
访问器:与属性名称相同。
设置器:名称以set开头,后跟首字母大写的属性名。
b.点语法:
myobject.属性的名称。 实际上是调用访问器方法。
myobject.属性的名称 = 输入值。 实际上是调用设置器方法。
注:若含有属性对象还没有完全创建好,就不要使用这些机制,而是(在内部)使用实例变量。
附:atomic的意思就是setter/getter这个函数是一个原语操作。如果有多个线程同时调用setter的话,不会出现某一个线程执行setter全部语句之前,另一个线程开始执行setter情况,相当于函数头尾加了锁一样。 nonatomic不保证setter/getter的原语行,所以你可能会取到不完整的东西。 比如setter函数里面改变两个成员变量,如果你用nonatomic的话,getter可能会取到只更改了其中一个变量时候的状态。
atomic是线程安全的,nonatomic是线程不安全的。如果只是单线程操作的话用nonatomic最好,因为后者效率高一些。