@end
@implementation ViewController
- (void)viewDidLoad {
__weak typeof(self) weakself = self;
dispatch_async(dispatch_queue_create(nil, DISPATCH_QUEUE_CONCURRENT), ^{
weakself.name = @"2222";
});
dispatch_async(dispatch_queue_create(nil, DISPATCH_QUEUE_CONCURRENT), ^{
NSLog(@"%@", weakself.name);
});
dispatch_async(dispatch_queue_create(nil, DISPATCH_QUEUE_CONCURRENT), ^{
weakself.name = @"11111";
});
dispatch_async(dispatch_queue_create(nil, DISPATCH_QUEUE_CONCURRENT), ^{
NSLog(@"%@", weakself.name);
});
}
- (void)setName:(NSString *)name {
_name = name;
}
@end
atomic 示例 :
{lock}
if (property != newValue) {
[property release];
property = [newValue retain];
}
{unlock}
用atomic会在多线程的设值取值时加锁,中间的执行层是处于被保护的一种状态,atomic是oc使用的一种线程保护技术,基本上来讲,就是防止在写入未完成的时候被另外一个线程读取,造成数据错误。而这种机制是耗费系统资源的,所以在iPhone这种小型设备上,如果没有使用多线程间的通讯编程,那么nonatomic是一个非常好的选择。
引用参考 : http://www.cnblogs.com/Rong-Shengcom/
补充
@dynamic: 同样是 @property 对应的关键字, 该关键字需要手动编写, 它会告诉编译器, @property 修饰的属性所对应的 getter 和 setter 是动态绑定, 由用户自己实现, 不需要自动实现, 若该属性是由 readonly 修饰, 则只需要实现一个 getter 即可. 注: 如果属性声明为 dynamic, 且用户没有实现该属性对应的 getter 和 setter, 编译时没有问题, 在用户调用属性的 getter 或 setter 的时候, 就会崩溃,报错 'unrecognized selector sent to instance', 编译时由于是@dynamic, 所以编译器不会报错, 运行时执行对应方法, 即动态绑定.
|