Does calling a method inside a block that calls another method referring to self cause a retain cycle?

烈酒焚心 提交于 2019-11-29 22:30:46

问题


Can doFirst cause a retain cycle here?

@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

回答1:


Unlike blocks, methods are not objects; they cannot hold a permanent reference to objects.

Your code would not cause a retain cycle. The fact that the code inside doSecond references self explicitly does not mean that self would get retained an extra time. When your block calls doSecond, its self comes from the weakSelf reference inside doFirst.

Note: When you store blocks as properties, use (nonatomic, copy) instead of (nonatomic, strong).




回答2:


No It won't. Because It just point to method which won't hold whatwhere inside methods which just an reference as like object.



来源:https://stackoverflow.com/questions/21909375/does-calling-a-method-inside-a-block-that-calls-another-method-referring-to-self

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!