块对象是否会导致保留周期?

时间:2014-08-26 15:50:34

标签: ios objective-c objective-c-blocks

我有这段代码:

@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!

3 个答案:

答案 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";    
});
相关问题