我有这段代码:
@implementation example
{
NSString *myObject;
}
- (void)viewDidLoad
{
[super viewDidLoad];
__block NSString* blockObject = myObject;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0),^(void){
blockObject = @"Hello world";
});
}
现在因为我正在使用__block,所以对self进行了强引用,因为我通过引用而不是按值访问实例变量。
所以上面的代码与:
相同@implementation example
{
NSString *myObject;
}
- (void)viewDidLoad
{
[super viewDidLoad];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,0),^(void) {
myObject = @"Hello world";
});
}
因此,在块退出之前不会调用dealloc方法。我的编译器使用arc!
答案 0 :(得分:1)
__block NSString* blockObject = myObject;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0),^(void){
blockObject = @"Hello world";
});
以上代码不会强烈保留self
,因此在dealloc
退出之前,您的block
将被称为。为什么它不会强烈保持self
是因为您正在创建一个新变量blockObject
并且阻止将强烈保留此变量而非ivar因此不保留self
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,0),^(void) {
myObject = @"Hello world";
});
在self
退出之前,上述代码将强力保留dealloc
并且block
不会被称为。
答案 1 :(得分:1)
你问题中的两个例子实际上是非常不同的。
第一个导致实例变量myObject
无变化,而第二个变为" Hello world"。
答案 2 :(得分:0)
通常如果我必须访问实例变量,我会写这样的东西...... fyi。伪代码
__weak typeof(self)weakSelf = self;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,0),^(void) {
__strong typeof(weakSelf)strongSelf = weakSelf;
strongSelf->myObject = @"Hello world";
});