2013-06-25 50 views
4
NSString *myString = [NSString stringWithFormat:@"string1"]; 
__weak NSString *myString1 = myString; 
myString= nil; 
NSLog(@"%@, %@",myString,myString1); 

我期待null , null。但輸出是string1, (null)。爲什麼myString1仍然保持該值,因爲myString被設置爲nil?__弱點參考對我來說仍然是一個謎

+0

這個問題不是關於Xcode也不是iPhone。這是一個關於Objective-C的問題。 – 2013-06-25 19:53:21

+0

對我來說,輸出是'(null),string1'。 – 2013-06-25 19:55:08

+1

它可能不會將弱的參考值歸零直到後來(退出塊等) – faffaffaff

回答

8

弱引用只在對象被釋放時才被清零。該對象不會立即釋放(可能是在這裏的autorelease池中,儘管在不同情況下可能會有其他許多原因),所以引用仍然存在。

+3

這必須是答案。在非ARC域中,'[NSString stringWithFormat]'返回一個自動釋放的對象,因此推測ARC也是這樣編碼的。如果我們做'NSString * myString = [[NSString alloc] initWithFormat:@「string1」];'我們得到提問者期望的nil輸出。 –

+1

@SteveWaddicor排序;釋放順序或釋放時間不一定得到保證。事實上,打開優化器可能會使事情更快地釋放(因爲優化器將消除有效的「保留/自動釋放」序列)。 – bbum

+0

謝謝你回答。我期待着一樣的。 –

0

輸出應該是(null), string1而不是string1, (null)。我想你輸錯了它。

您明確地將一個引用設置爲nil,但其他引用仍在定義範圍內使用(因爲您在NSLog中使用它)。因此,在使用完成之前,它不會被ARC發佈。


弱引用不能保留它。你使用它的事實意味着ARC會保持它(通過不添加發布代碼)。一旦該用法完成,ARC將釋放該對象,然後弱引用將被刪除。

+1

但是__weak而不是__strong的意義在於它不會堅持被指向的東西。 –

+0

這只是[NSString stringWithFormat]的預期自動釋放行爲。查看Chuck的回答和我的評論。 –

1

我認爲你的問題可以通過這句話從Memory Management Guide

尤其你不應該設計類,這樣的dealloc將 調用當你​​認爲它會被調用來回答。調用dealloc可能會因爲錯誤或因爲應用程序拆卸而延遲或迴避 。

3

嘗試這樣:

NSString *myString; 
NSString* __weak myString1; 
@autoreleasepool{ 
    myString= [NSString stringWithFormat:@"string1"]; 
    myString1= myString; 
    myString= nil; 
} 
NSLog(@"%@, %@",myString,myString1); 

說明

你可能會注意到,有很多方法來分配字符串或一般對象:

1)[ NSString stringWithFormat:...]/[[NSString alloc] initWithFormat:...];
2)[NSArray arrayWithArray:...]/[[NSArray alloc] initWithArray:...];
...

(也可用於許多其他類)

的方法,第一類返回一個自動釋放的對象。第二個是非自動釋放對象。事實上,如果在上面的代碼中使用頁頭 + initWithFormat:中代替stringWithFormat:你不需要一個自動釋放池看到,這兩個對象將是

相關問題