簡體   English   中英

自動引用計數混亂

[英]Automatic reference counting confusions

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

我在想對嗎?

那么這是否意味着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]; 

如果ARC開啟 ,它將變成這樣,

 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]; 

任何輸入都會有所幫助,謝謝

干杯!

是和否:

是的,ARC趕走你的手動調用retainreleaseautorelease ,可能讓你刪除了不少你的dealloc實現和-在新的運行環境-甚至推出零弱引用(!w00t), 但它並不妨礙你泄漏本身

它是自動保留/釋放而不是垃圾收集器,因此它“允許您”通過創建保留循環來泄漏內存。

此外,它將__block屬性的引用語義從weak變為strong
通過使用__block id blockSelf = self;避免捕獲self的代碼的每一部分__block id blockSelf = self; 現在是潛在的泄漏-幸運的是,Clang可以更好地警告您有關此類問題的信息。

在大多數情況下,ARC實際上使您編寫的代碼比以前更多的地方是在CFTypeRefid <NSObject>之間使用免費電話橋接時:
必須注釋強制類型轉換,以告訴ARC該怎么做,否則您將得到編譯器錯誤。

如果您使用的是普通CF API,則沒有任何變化:一切保持手動。

我發現的有關ARC的最佳資源之一是Chris Parker關於ARC Internals的WWDC演講。 如果您還沒有看到它,那么您絕對應該檢查一下 -ARC的一般部分開始於8分鍾左右,而詳細信息開始於29分鍾左右。

您的示例代碼是正確的。 ARC為您進行了這些調用。

但是,ARC不會“完全接管”新手仍然需要了解內存管理。 但是就像蘋果公司所說的那樣,它使您可以專注於對象所有權而不是保留計數。

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

你是對的。 ARC幾乎使您擺脫了進行內存管理的麻煩,並使編譯器處理了所有這些事情。 坐下來,放松,並更多地擔心編寫所需的代碼,而不是引起瑣碎的內存管理問題:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM