塊作為屬性
@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;
};