2012-03-10 144 views
1

因此,標準規則是如果一個對象是使用alloc創建的,複製或保留,它需要一個後續版本。使用便捷方法創建的對象是自動發佈的。 但是用「=」定義並用在方法範圍中的臨時變量呢?例如(iOS)臨時變量的內存管理

NSError *error = nil; 
NSString *tempString = @"foo"; 
int number = otherInt * 32; 
NSUInteger row = [indexPath row]; 
NSArray *sameArrayDifferentPointer = otherArray; 

甚至

NSArray *sameArrayDifferentPointer = (*NSMutableArray) otherMutableArray; 

我知道最後一個是「壞」,但編譯罰款,不拋出異常。

回答

1

error,numberrow不是對象(或指向對象的指針),所以它們不需要(並且實際上不能)被釋放。 (number是int,row或者是一個無符號的int或無符號長,error是指向零。)

tempString將被自動釋放,線路

NSString *tempString = @"foo"; 

等效
NSString *tempString = [NSString stringWithString:@"foo"]; 

第二種寫法使得它更清晰。同樣,您的陣列相當於調用[NSArray arrayWithArray:otherArray]

+0

第二種情況如何更好?將一個常量字符串分配給一個變量沒有任何問題。 – Caleb 2012-03-10 03:51:41

+0

當然不是。而且你在這兩個版本中都給一個變量分配一個常量字符串。更詳細的更清楚發生了什麼事情,這對澄清有幫助。但我認爲第二個'通常更好'的說法可能太強大了 - 將會被編輯。 – 2012-03-10 03:54:30

+0

具有完美的感覺。對於Objective-C甚至C語言來說都很新穎,指針的概念仍然讓我興奮不已。謝謝。 – TijuanaKez 2012-03-10 03:57:58

2

But what about temp vars defined with "=" and used in the scope of a method?

同樣的規則適用。那些值是alloccopy還是retain?我在您提供的示例中看不到一個alloccopyretain。因此,不需要release