2011-11-27 55 views
0

我一直在閱讀不同來源的自動引用計數,但沒有找到任何明確我的理解的文章或文檔。我對ARC(自動引用計數)的理解是,它完全接管了開發人員對內存管理的控制,並將其分配給編譯器進行內存管理。自動引用計數混淆

我想對嗎?

那麼這是否意味着保留,發佈和autorelease不再是iOS 5 SDK?


例子:

可以說,我用它來作這樣的對象,

UIView *message = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, cell.frame.size.width, cell.frame.size.height)]; 
message.tag = 0; 
[message addSubview:balloonView]; 
[message addSubview:label]; 
[cell.contentView addSubview:message]; 

[balloonView release]; 
[label release]; 
[message release]; 

會變成這個樣子IF ARC爲ON

UIView *message = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, cell.frame.size.width, cell.frame.size.height)]; 
message.tag = 0; 
[message addSubview:balloonView]; 
[message addSubview:label]; 
[cell.contentView addSubview:message]; 

任何輸入將有幫助謝謝

乾杯!

回答

6

是的,沒有:

是,ARC趕走你的手動調用retainreleaseautorelease,可能可以刪除相當多的dealloc實現,並且 - 在新的運行時間 - 甚至會引入調零弱引用(w00t!),,但它不會阻止您泄漏,本身

它是自動保留/釋放而不是垃圾收集器,所以它「允許你」通過創建保留循環來泄漏內存。

此外,它改變了__block屬性的參考語義從weakstrong
在您使用__block id blockSelf = self;避免self捕獲的代碼的每一位現在是一個潛在的泄漏 - 幸運的是,鏘甚至變得更好警告你關於這樣的問題。

的區域,其中ARC實際上使你寫的比以前代碼,大多數時候,是當你正在使用免費電話橋接CFTypeRef S和id <NSObject> S之間:
的強制轉換必須註解告訴ARC該做什麼或者你會得到一個編譯器錯誤。

如果您使用的是簡單CF API,則不會發生任何更改:一切都保持手動。

我發現ARC上最好的資源之一是Chris Parker關於ARC內核的WWDC演講。如果你還沒有看到,你應該肯定check it out - ARC的一般部分在8分鐘左右開始,而細節開始約29分鐘。

1

您的示例代碼是正確的。 ARC爲你打電話。但是,ARC並沒有「完全接管」新手,但仍然需要了解內存管理。但就像蘋果說,它可以讓你專注於對象所有權,而不是保留數量。

例如,如果您不修改NSObject <Protocol> *_delegate;__weak__unsafe_unretained您仍將創建一個保留週期。

0

是的,你是對的。 ARC幾乎從您手中進行內存管理的麻煩,並讓編譯器處理所有這些東西。坐下來,放鬆,而且更擔心寫你想要的代碼,而不是造成瑣碎的內存管理問題:)