2012-09-15 84 views
1

可能重複會發生什麼:
Is AutoRelease redundant when using ARC in Objective-C?時自動釋放對象被分配到強變量

我新的目標C和理解它的內存管理。我真的很難理解強變量的行爲。下面是一些令我困惑的片段。我有以下方法,我正在使用ARC。

-(void) watchStrongVariable { 
    MyClass * myobj = [self getMyClassObject]; 
    // ... 
} 

-(MyClass *) getMyclassObject{ 
    return [[[MyClass alloc] init] autorelease]; 
} 

在線路#2中,我分配MyClass對象的局部變量myobj。我讀到所有局部變量默認強壯,強壯與保留相似。因此,在上述情況下,我的假設是myobj被保留,並在方法watchStrongVariable中擁有,但是由於myobj被保留,沒有釋放消息發送到本地變量。有人可以向我解釋爲什麼在上述情況下不需要發佈myobj

回答

2

當您使用ARC時,您無法使用保留,發佈或autorelease,因爲ARC會爲您照顧。你可以簡單地這樣做:

- (MyClass *)getMyclassObject { 
    return [[MyClass alloc] init]; 
} 

編譯器會爲你添加autorelease調用。但是ARC的整個觀點不再需要考慮很多。

2

使用ARC時,您不需要使用autorelease任何東西。實際上,這會產生編譯器錯誤。

因此,在使用ARC時,這將是正確的:

-(MyClass *) getMyclassObject{ 
    return [[MyClass alloc] init]; 
} 
+2

「實際上,這會產生一個編譯器警告。」相反,一個錯誤 - 警告不是致命的,但這是一個錯誤。 +1雖然。 – 2012-09-15 19:40:24

+1

感謝H2CO3,你是對的。我修改了我的答案。 – gilletty

2

一,你不能用明確的retainrelease也不autorelease當在ARC - 編譯器不會允許它。

二,在這種情況下,你不必考慮這個問題,因爲它很簡單 - 當一個強變量超出範圍時,它相當於一條release消息。那麼ARC如何工作就是:

- (void)watchStrongVariable 
{ 
    MyClass *myobj = [self myClassObject]; // implicit retain-on-assignment 
    // implicit release-on-end-of-scope 
} 

- (MyClass *)myClassObject 
{ 
    return [[MyClass alloc] init]]; // implicit release-after-return 
} 

關於編碼風格的一些建議。一,不要使用getXXXX作爲獲取方名稱 - 這是爲具有輸出標記的方法(即接受要寫入的指針)保留的方法,如UIColor的getRed:green:blue:alpha:方法。 二,對於函數,開放大括號分開一行,並且星號表示指針類型應該與變量名稱而不是類型衝突。所以最好是寫int *i;而不是int* i;或​​3210。

+0

感謝您的答覆。我會考慮所有的建議。如果在上述情況下,我沒有使用ARC,那麼影響和myobj上發佈是必要的,爲什麼。 – user1673825