块作为属性
@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;
};