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

StackOverflow https://stackoverflow.com/questions/21909375

  •  14-10-2022
  •  | 
  •  

문제

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
도움이 되었습니까?

해결책

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).

다른 팁

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top