使用儀器的榮譽。
首先,您應該直接在init/dealloc中使用iVar。
二,你自己綜合它,還是自己實施二傳手?
另外,你運行調試或發行優化的代碼?
現在,解釋爲什麼我用更多的問題回答你的問題。
如果合成它自己(即宣告自己的實例變量,你也必須聲明,作爲__weak。如果你讓編譯器做到這一點,它會妥善處理。
現在,你顯然因此,編譯器會自動添加代碼來執行手動引用計數(其中一些可能會在稍後由優化器刪除)。現在,我並不假裝自己是編譯器創建的專家,但是,它將非常接近以下內容
以一個基本任務爲例...
- (void)setContainer(Container*)container {
_container = container;
}
當編譯器完成其注入代碼ARC,這將是這個樣子(假設_container未聲明__weak)...
// Converted by ARC -- so it's MRC
- (void)setContainer(Container*)container {
[container retain];
Container *oldContainer = _container;
_container = [container retain];
[oldContainer release];
[container release];
}
現在,讓我們更進了一步,假設_container是__weak ,我們得到這樣的事情...
- (void)setContainer(Container*)container {
[container retain]
Container *oldContainer = [_container retain];
objc_storeWeak(&_container, container);
[oldContainer release];
[container release];
}
現在,objc_storeStrong是分配給一個變量強的順序,所以很明顯,其中,將適合在上面的代碼。
此外,請注意,編譯器是如何審慎添加代碼的。優化器非常具有侵略性,並且可以移除顯然不需要的大多數保留/釋放對。因此,在大多數情況下,您將在函數中看到用於保留/釋放的不同語義,具體取決於您是構建調試還是發佈。
但是,一般來說,除非指定__unsafe_unretained,否則您必須期望至少獲得任何參數的保留。
現在,這不可能是好的。你確定這是什麼調用objc_storeStrong?因爲它似乎是您的情況違背了[CLANG ARC參考(http://clang.llvm.org/docs/AutomaticReferenceCounting.html#runtime.objc_storeStrong)。 – CodaFi 2012-08-04 01:56:47
我正在使用模擬器。我已經檢查並確保ARC在項目設置中處於打開狀態,並且目標是使用Apple LLVM編譯器3.1。我敢肯定,我可以在儀表以下調用堆棧指針看到一個額外保留對話框:4 DialogPanel initWithContainer:] 3 DialogPanel setContainer:] 2 libobjc.A.dylib objc_storeStrong 1 libobjc.A.dylib objc_retain 0 CoreFoundation - [NSObject retain] – mikemeli 2012-08-04 02:26:36