块作为属性

@interface MyObject : MySuperclass

@property (copy) void (^blockProperty)(NSString *string);

@end

在分配时,由于 self 保留 blockProperty,block 不应包含对 self 的强引用。这些相互强烈的引用被称为保留周期,并将阻止任何一个对象的释放。

__weak __typeof(self) weakSelf = self;
self.blockProperty = ^(NSString *string) {
    // refer only to weakSelf here.  self will cause a retain cycle
};

这是非常不可能的,但是 self 可能会在执行期间的某个区域内被解除分配。在这种情况下,weakSelf 变为 nil 并且所有消息都没有期望的效果。这可能会使应用程序处于未知状态。这可以通过在块执行期间使用 __strong ivar 保留 weakSelf 并在之后清理来避免。

__weak __typeof(self) weakSelf = self;
self.blockProperty = ^(NSString *string) {
    __strong __typeof(weakSelf) strongSelf = weakSelf;
    // refer only to strongSelf here.
    // ...
    // At the end of execution, clean up the reference
    strongSelf = nil;
};