通过对象来存储并传递数据,
在对象之间传递数据并执行任务的过程称为“消息传递”。
OC对象会把其所需要的数据保存为实例变量并通过“存取方法”来访问。这称为属性。
@dynamic
告诉编译器:不要自动创建实现属性所用的实例变量,也不要为其创建存取方法。这样在编译时虽然发现没有定义存取方法也不会报错,相信在运行期能找到。
例:CoreData 框架中的NSManagedObject类的子类时,用了这个关键字,说明数据是在运行时创建存取方法的。
属性特质:4类
原子性:nonatomic,非原子的, 不使用同步锁。这并不能保存线程安全。
非原子性:使用同步锁开销较大,所以iOS程序几乎不用。但在Mac OS X程序时,对性能没什么影响。
读写、只读:readwrite, readonly(没有setter方法)
内存管理语义:
assign, strong(先保留新值,并释放旧值,再赋新值), weak(既不保留新值,也不翻放旧值,类似assign,安全), unsafe_unretained(类似assign,与weak的区别:不安全), copy(与strong类似,避免可变发生,例如:字符串NSString,因为值可能来自子类NSMutableString,可能被更改,所以用copy)
方法名设置别名:例:@property(nonatomic, getter = isOn) BOOL on;
在设置属性所对应的实例变量时,一定要遵从该属性所声明的语义。
例: init方法中
-(id)initWithFirstName:(NSString*)firstName lastName:(NSString*)lastName {
if(self = [super init]) {
_firstName = [firstName copy];
_lastName = [lastName copy];
}
return self;
}