前文地址:《iOS基础深入补完计划》
在前文、我们提到了property中的关键字atomic。
那么、atomic究竟如何保证了属性的原子性。
这种保护是否是无条件的呢。
具体的加锁代码
- (UITextField *) userName {
UITextField *retval = nil;
@synchronized(self) {
retval = [[userName retain] autorelease];
}
return retval;
}
- (void) setUserName:(UITextField *)userName {
@synchronized(self) {
if (_userName != userName) {
[userName release];
userName = [userName_ retain];
}
}
}
这样就保证了成员变量‘读写操作’完整性。
在多线程下读写同一个属性、也不用担心得不到一个完整的Value。
-
※※※那么、atomic声明的属性一定是线程安全的么。
安全的情况。
正常读写(getter/setter)
正常读写
不安全的情况
对该对象不通过setter/getter方法的一切操作。正如上文所说:
atomic只是在对象的读写方法内部加了一层Look。因为property的权限只能到这。那么、结果显而易见。1、直接进行对象操作。
NSMArray的addobject操作
为了进一步确定atomic的原子性是否不直接作用于成员变量上。
2、直接进行成员变量的操作
self.arr在写入数据的时候可以保持完好。
WechatIMG199.jpeg在红色地址已经发生被释放并改变成绿色地址的情况下。对红色旧指针操作导致崩溃。
至此、property声明中关于atomic/nonatomic的说明结束。
相关阅读:《Realm》、《[爆栈热门 iOS 问题] atomic 和 nonatomic 有什么区别?》、《[OC]之 atomic 与 nonatomic的区别》。
网友评论