塊作為屬性

@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;
};