2017-03-29 21 views
0

好吧,我们知道我们可以有保留周期如果我们做到这一点块保持周期是否适用于块调用?

[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

+0

保留周期创建时,我们有超过2个对象的引用。超出范围时,ARC会减少保留计数。但是如果我们有一个以上的对象的强引用,那么保留周期就会发生。 (i)要删除保留周期,请在块的情况下专门针对对象进行弱引用。因为块创建一个单独的对象我喜欢这样做你做了什么:__weak typeof(self)weakSelf = self; [someObject messageWithBlock:^ {[weakSelf doSomething]; }]; (二)功能没有任何问题 – ajjjjjjjj

+0

请让这个评论一个答案,所以我可以接受。谢谢 – SpaceDog

+0

我觉得函数只是一种占位符代码,所以引用你的'弱自我'就不会有问题 – Tj3n

回答

1

无保留周期在此代码:

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

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

说明

在上面的代码

[weakSelf doSomething]; 

意味着现在接收器对象(个体)已成为weakSelf即任何打到doSomething内的自己都会提到weakSelf。 因此,在doSomething内引用自我并不会创建保留周期。

谈代码如下:

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

作为块内的接收器对象是,而不是weakSelf这将产生一个保留周期。

+0

谢谢。在第二个代码中,MY_TABLE是一个定义,但假设它是在类中定义的一个ivar。它会创建一个保留周期吗? – SpaceDog

1

保留周期创建时,我们有超过2个对象的引用。超出范围时,ARC会减少保留计数。但是如果我们有一个以上的对象的强引用,那么保留周期就会发生。 (i)要删除保留周期,请在块的情况下专门针对对象提供弱引用。因为块创建对象的单独副本,我喜欢这个,你做了什么:

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

(二)功能没有任何问题

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