块的保留周期是否适用于块调用的方法?

时间:2017-03-29 04:09:56

标签: ios objective-c iphone automatic-ref-counting

好的,我们知道如果我们这样做,我们可能会有一个保留周期

[someObject messageWithBlock:^{ [self doSomething]; }];

并且解决方案是这样的

__weak typeof(self) weakSelf = self;
[someObject messageWithBlock:^{ [weakSelf doSomething]; }];

但是,如果我们这样做最后一个代码但doSomething有很多自我引用呢?像:

- (void) doSomething {
    self.myProperty = @"abc";
    [self doOtherThing];
}

这会创建保留周期吗?

这是怎么回事:

__weak typeof(self) weakSelf = self;
[someObject messageWithBlock:^{ 
   self.onError(NSLocalizedStringFromTable(@"Error", MY_TABLE, nil))
}];

MY_TABLE是#define

2 个答案:

答案 0 :(得分:1)

当我们有2个以上的对象引用时,会创建

保留周期。当超出范围时,ARC会将保留计数减少。但是如果我们对一个对象有超过1个强引用,则保留循环。

(i)要删除保留周期,请始终在块的情况下特别采用对象的弱引用。因为块创建了一个单独的对象副本我喜欢你所做的:

 __weak typeof(self) weakSelf = self; 
[someObject messageWithBlock:^{ 
[weakSelf doSomething];
 }]; 

(ii)功能不是任何问题

- (void) doSomething {
    self.myProperty = @"abc";
    [self doOtherThing];
}   

答案 1 :(得分:1)

此代码中没有保留周期:

__weak typeof(self) weakSelf = self;
[someObject messageWithBlock:^{ [weakSelf doSomething]; }];

- (void) doSomething {
    self.myProperty = @"abc";
    [self doOtherThing];
}

<强>解释

在上面的代码中

[weakSelf doSomething];

表示接收器对象(self)现在变弱了自己。在 doSomething 中对self的任何调用都将引用weakSelf。 因此,在doSomething中引用self不会创建保留周期。

谈论以下代码:

__weak typeof(self) weakSelf = self;
[someObject messageWithBlock:^{ 
   self.onError(NSLocalizedStringFromTable(@"Error", MY_TABLE, nil))
}];

由于块内的接收器对象是 self ,而不是weakSelf,这将创建一个保留周期。