2011-01-19 88 views
1

保留和自動發佈問題。基本保留,自動發佈問題

// A 
UIView *temp = [[UIView alloc] init]; 
myView = temp; 
[temp release]; 

// B 
myView = [[UIView alloc] init]; 

這兩個代碼沒有區別嗎?

NSString *str = [NSString stringWithString:@"Hello"]; 
NSString *str = @"Hello"; 

而這兩個?我不確定保留數。謝謝。

+0

謝謝zoul編輯我的文章:) – Suho 2011-01-19 16:19:44

回答

3

對於第一個例子,它們是非常不同的。在第一個代碼塊中,賦給temp的UIView的保留計數爲1(感謝alloc)。當你在第三行釋放它時,MyView變量現在不好,因爲對象可能被銷燬。如果你想MyView的保留它,這樣做:

MyView = [temp retain]; 

第一個例子中的第二部分將創建一個UIView,這也在temp沒有關係的一個全新的實例。

在第二個示例中,stringWithString方法將autorelease您的字符串,這意味着將在稍後發佈「發佈池」時自動爲您發佈。你不必擔心釋放它。然而,在第二行中,該字符串是靜態分配的。保持計數並釋放對他們來說完全沒有必要。

忘了提及...查看the answer to this question瞭解更多關於保留/發佈規則的信息。

+0

謝謝Tesserex和其他人! – Suho 2011-01-19 16:32:49

0

第一部分:它不一樣!

MyView也將被釋放,因爲您只是複製指針(保留計數0)。 在第二MyView的代碼將保留1


第二部分的計數:它基本上是相同的。

0
  1. 請記住,參考MyView只是指向溫度。所以一旦你釋放temp,這也會影響MyView。

  2. [NSString stringWithString:]主要用於複製其他字符串而不是引用內存地址。 E.g:

答:

的NSString *串= someOtherString; //將引用複製到someOtherString;

B:

的NSString *串= [的NSString stringWithString:someOtherString]; //製作另一個字符串的副本。

+0

這是不正確的,stringWithString不會複製一個字符串,它會返回並自動釋放字符串 – 2011-01-19 16:19:09

0

一個有用的事情是,你可以NSLog的retaincount,以便你可以自己做測試。

但回到你的問題...

如果MyView是一個屬性,並且您使用self.MyView引用它,並且它是使用retain或copy聲明的,則您的2個語句是相同的。如果MyView的僅僅是一個局部變量,你的UIView會的dealloc,當你做

[temp release]; 

,因爲你沒有做什麼,以增加保留計數,因爲你alloced它。

爲了您的字符串例如...

[NSString stringWithString:@"Hello"]; 

返回一個字符串自動釋放。如果您需要保存很長時間,您需要在其上留下保留。

第二個字符串的例子是一個靜態分配的字符串,你不必擔心它。保留計數不適用於他們。

+0

myView不使用點,因此,如果它是一個屬性或沒有關係,因爲直接分配不會觸發保留。 – bbum 2011-01-19 16:22:33