1.@property
首先我们要只知道当你写下@property的时候,内部做了什么操作?举个例子:@property NSObject *obj;这个时候编译器做了三件事:1.创建了实例变量obj;2.声明了obj属性的setter和getter方法;3.实现了obj属性的setter和getter方法。
其次,就是@property的本质是什么?其实就是一句话,使用@property系统化会自动生成setter和getter方法。那么接下来解释下其几个关键字的区别和作用。
2.atomic和nonatomic
atomic和nonatomic其实就是决定了属性的setter和getter是否是原子性操作。那么什么是原子性操作?简单理解就是系统生成的setter和getter是否可以保证set和get的完整性。atomic是可以保证其完整性的,nonatomic是不可以的。我们看下它们各自是怎么实现的:
/// atomic对象
- (void)setMyImage:(UIImage *)myImage
{
@synchronized(self) {
if (_myImage != myImage) {
[_myImage release];
_myImage = [myImage retain];
}
}
}
- (UIImage *)myImage
{
@synchronized(self) {
return _myImage;
}
}
/// nonatomic对象
- (void)setMyImage:(UIImage *)myImage
{
if (_myImage != myImage) {
[_myImage release];
_myImage = [myImage retain];
}
}
- (UIImage *)myImage
{
return _myImage;
}
也就是说:如果有多个线程同时调用setter的话,atomic不会出现某一个线程执行完setter全部语句之前,另一个线程开始执行setter情况,相当于函数头尾加了锁一样,每次只能有一个线程调用对象的setter方法,所以可以保证数据的完整性。nonatomic就不能保证了,nonatomic返回的对象可能就不是完整的value。因此,在多线程的环境下原子操作是非常必要的,否则有可能会引起错误的结果。但仅仅使用atomic并不会使得对象线程安全,我们还要为对象线程添加lock来确保线程的安全。另外说下它们两个其他的区别:
- nonatomic的速度要比atomic的快。atomic是Objc使用的一种线程保护技术,这种机制是耗费系统资源的,所以在iPhone这种小型设备上,我们基本上都是使用nonatomic,而对象的线程安全问题则由程序员代码控制。
- atomic与nonatomic的本质区别其实也就是在setter方法上的操作不同