Ios 在调用引用self的另一个方法的块内调用方法是否会导致保留循环?
Ios 在调用引用self的另一个方法的块内调用方法是否会导致保留循环?,ios,retain-cycle,Ios,Retain Cycle,doFirst是否会在此处引起保留循环 @interface Example : NSObject @property (nonatomic, strong) void (^block)(); @end @implementation Example - (void)doFirst { __weak id weakSelf = self; self.block = ^ { [weakSelf doSecond]; };
doFirst
是否会在此处引起保留循环
@interface Example : NSObject
@property (nonatomic, strong) void (^block)();
@end
@implementation Example
- (void)doFirst
{
__weak id weakSelf = self;
self.block = ^ {
[weakSelf doSecond];
};
self.block();
}
- (void)doSecond
{
self.value = //...
// do other stuff involving self
}
@end
与块不同,方法不是对象;它们不能永久引用对象 您的代码不会导致保留周期。
doSecond
中的代码引用了self
这一事实并不意味着self
会被额外保留一段时间。当块调用doSecond
时,其self
来自doFirst
中的weakSelf
引用
注意:如果将块存储为属性,而不是
(非原子,强)
否,则不会。因为它只是指向一个方法,而这个方法并不能保存方法中的内容,而这些方法只是一个类似对象的引用。为什么copy
vsstrong
在这里很重要?它由Example
类创建和拥有,而不是由其他类提供。好了,这难道不会在创建块时增加额外的开销吗?不管copy
vsstrong
语义如何,这都是一个明确的答案,而且很有意义,特别是关于方法不是对象的问题+1.谢谢。@JRG Developer您需要在堆栈上创建块的副本。在您显示的代码中,这并不重要,因为您在退出定义块的方法之前调用了该块。但是,如果希望块留在附近,则需要在方法退出之前复制它。引用weakSelf时的一个有用提示是执行以下操作:\uu弱类型(self)weakSelf=self
。当在不同的地方重用代码时,使事情变得更容易