2012-02-20 85 views
2

有二傳手的例子很多,我們應該怎麼做,例如:不必要地釋放

- (void)setFoo:(NSString *)newFoo 
{ 
    if (foo != newFoo) 
    { 
     [foo release];//?? 
     foo = [newFoo retain]; 
    } 
} 

我的理解是,我們需要釋放上一個值,然後分配新的有保留,這是怎麼文檔說我們要做,但我不明白我們應該發佈什麼,如果分配foo = [newFoo retain];會使foo成爲newFoo當前保留計數器的新值,如果甚至foo的保留計數器在5之前,它就會變成newFoo的+1,或者我有些想法和理解不正確。爲什麼我們不能這樣做:

- (void)setFoo:(NSString *)newFoo 
{ 
    if (foo != newFoo) 
    { 
     foo = [newFoo retain]; 
    } 
} 

回答

1

Objective-C與指針(一切都是指針)一起工作。

當您執行retainrelease時,您不是在引用/指針(您的變量名稱)上執行此操作,而是在實際對象本身上執行此操作。這就是爲什麼我們需要釋放舊對象(因爲我們已經完成了它),並將我們的變量指向新的對象(然後增加它的retain計數,所以它不會被別的東西去除) 。

希望是有道理

+0

哦,10倍,我明白了。事實上,我們需要釋放的不是var,而是內存單元 – 2012-02-20 19:35:03

0

foo是一個指針(存儲器地址)指向存儲在存儲器中一個NSString對象。當這個setter函數啓動時,內存中有兩個NSString對象:一個被指向並由foo保留,另一個被作爲參數傳入。每個對象都有自己的保留計數。

foo == newFoo告訴指針停止指向舊的NSString,並開始指向新的NSString。

如果在更改指針之前未釋放第一個對象,則會導致內存泄漏。舊的對象不會有任何指向它的東西(所以它不存在,只要你的程序知道),但它的保留計數將永遠不會達到0,並且因爲它仍然被保留而被取消分配。

+0

10x,聽起來不錯,倒掉我的腦袋 – 2012-02-20 19:38:32