Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在调用引用self的另一个方法的块内调用方法是否会导致保留循环?_Ios_Retain Cycle - Fatal编程技术网

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
vs
strong
在这里很重要?它由
Example
类创建和拥有,而不是由其他类提供。好了,这难道不会在创建块时增加额外的开销吗?不管
copy
vs
strong
语义如何,这都是一个明确的答案,而且很有意义,特别是关于
方法不是对象的问题+1.谢谢。@JRG Developer您需要在堆栈上创建块的副本。在您显示的代码中,这并不重要,因为您在退出定义块的方法之前调用了该块。但是,如果希望块留在附近,则需要在方法退出之前复制它。引用weakSelf时的一个有用提示是执行以下操作:
\uu弱类型(self)weakSelf=self
。当在不同的地方重用代码时,使事情变得更容易