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

ios, retain-cycle

Solution

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

Problem

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 ```

Original source

Related problems