簡體   English   中英

ARC“刪除未使用的自動釋放消息是不安全的”

[英]ARC “It is not safe to remove an unused autorelease message”

轉換到ARC時,我收到以下編譯器錯誤:“刪除未使用的自動釋放消息是不安全的”。

如果我只是刪除自動釋放消息,obj將立即在getAutoreleasedObj結束時釋放,這將導致printObj崩潰。 那么如何處理自動釋放的對象,並將以下代碼轉換為ARC?

- (MyClass *) getAutoreleasedObj {
    MyClass *obj = [[MyClass alloc] init];
    [obj autorelease];
    return obj;
}

- (void) printObj {
NSLog(@"%@", [self getAutoreleasedObj];
}

您不必自動釋放它,因為它是從函數返回的,ARC將隱式地使它__autoreleasing並為您釋放它。

這段代碼:

-(id) getAutoReleasedObject
{
    __autoreleasing MyClass *obj = [MyClass new];
    return obj;
}

編譯到:

-(id) getAutoReleasedObject 
{
    MyClass *obj = [MyClass new]; 
    return [obj autorelease];
}

您必須刪除對autorelease的調用:

- (MyClass *) getAutoreleasedObj {
    MyClass *obj = [[MyClass alloc] init];
    // [obj autorelease];
    return obj;
}

方法printObj現在等效於以下內容:

- (void) printObj {
    MyClass *obj = [self getAutoreleasedObj];
    // At his point there is a reference to obj
    NSLog(@"%@", obj);
    // There are no references to obj now, ARC will take care of it. 
}

我的意思是對obj的有效引用將被傳遞給NSLog ,之后,將沒有對obj其他引用。

你說:

如果我只是刪除autorelease消息,obj將立即在getAutoreleasedObj結束時釋放

那是不對的。 由於您的方法名稱( getAutoreleasedObj )不適合alloc / init / copy / mutableCopy / new模式,因此ARC自動假定您希望自動釋放obj

你不會在getAutoreleasedObj結尾處排出任何自動釋放池,因此不會釋放obj

代碼運行時,某些自動釋放池處於活動狀態。 如果您尚未手動設置自動釋放池,則活動池是Cocoa運行循環設置的池。 該池在每次通過運行循環結束時耗盡。

因此,除非您在某處設置了自己的池,否則在getAutoreleasedObj創建的對象將一直存在,直到運行循環的當前迭代結束。

這個簡單的答案,與ARC無關,實際上是關於轉換過程和轉換為ARC的重寫器,是改變函數的最后兩行:

[obj autorelease];
return obj;

return [obj autorelease];

ARC轉換重寫器本身不允許[x autorelease],因為它認為如果不再引用x會很危險。 所以你基本上只需要確保使用[x autorelease]的返回值,在OPs情況下很容易完成。

如上所述,

您不需要在ARC中autorelease ARC將為您解決所有問題,因此您無需擔心。 在“ARC概述”下:

https://developer.apple.com/library/ios/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html

ARC標識您的方法系列以確定何時插入版本。 以init,copy,mutableCopy,new開頭的方法屬於“init”系列。 ARC在調用方法中插入一個版本。 在大多數情況下,您不必從方法返回自動釋放的對象。 ARC智能地為您插入釋放/保留。 您可以通過使用NS_RETURNS_RETAINED / NS_RETURNS_NON_RETAINED修飾方法來覆蓋此行為

您需要自動釋放的唯一情況是您通過寫回指針返回數據。 在您的情況下,您可以安全地刪除自動釋放呼叫。

暫無
暫無

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

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