2013-10-01 22 views
1

我知道你應該使用weakSelf來阻止自己生存以避免保留記憶週期。 like:weakSelf as iVar

__weak id weakSelf = self; 
self.block = ^{ 
    [weakSelf something]; 
} 

但我試圖找到一種通用的方法。我可以使用一個宏如:

#define Weakify(o) __weak __typeof__((__typeof__(o))o) 
#define WeakifySelf(o) Weakify(self) o = self; 

WeakifySelf(weakSelf) 
self.block = ^{ 
    [weakSelf something]; 
} 

這簡化,但我想知道爲什麼我不能在我的viewController上使用伊娃。

@interface YDViewController : UIViewController 
{ 
    __weak id _weakSelf; 
} 

然後用這個伊娃

self.block = ^{ 
    [_weakSelf something]; 
} 

任何想法?

回答

7

下面這個想法的問題在於,[_weakSelf something]在引擎蓋下與[self->_weakSelf something]完全一樣。

因此,即使您嘗試使用弱引用,您最終仍會使用強引用來獲取弱引用並捕獲兩者。

+0

謝謝,這就是我懷疑的......該死的那種吮吸...... –