2012-01-26 34 views
1

當引用在Objective-C的塊的內部的弱的ivar當ARC被使能,並運行時隱式地保持於其中的ivar所屬的對象?例如:如何實例變量弱的內存管理ARC在Objective-C啓用了塊內工作?

- (void) foo { 
    void (^block)() = ^{ 
     [_weakIvar doSomethingAwesomeButNotTooAwesome]; // Is self retained here? 
    } 
    block(); 
} 

雖然我們在這,但是在同一場景中弱財產又如何呢?

- (void) foo { 
    void (^block)() = ^{ 
     [self.weakProperty doSomethingAwesomeReallyAwesomeDudeYeah]; 
    } 
    block(); 
} 

回答

2

_weakIvar實際上意味着self->_weakIvar這意味着什麼(自動地)保留是self引擎蓋下。在做self.weakProperty時同樣適用。

在你的具體的例子,該塊不被複制(並馬上使用),所以沒有被保留在所有,但如果你(例如)做:

- (void) foo { 
    void (^block)() = ^{ 
     [_weakIvar doSomethingAwesomeButNotTooAwesome]; 
    } 
    dispatch_async(queue, block); // here, block is copied and so self is retained 
} 
+0

然而,即使'self'被保留通過將塊複製到堆上,它不一定會創建一個循環,是嗎? – 2012-01-26 22:51:12

+0

如果自由塊*保留和*的塊由自(例如,如果該塊被存儲在一個實例變量或強/複製屬性)保留它創建了一個週期。 – 2012-01-26 23:44:53

+0

是啊,這就是我的想法。我不確定塊的實現細節。在.NET世界我來自哪裏,「代表」(大致相同的塊)有不同的內存管理語義。 – 2012-01-31 00:08:20