2012-07-10 15 views
1

__weak上的NSString和NSURL有什麼不同?__weak在NSURL和NSString上的不同行爲

我的例子:

__weak NSURL *myURL = [NSURL fileURLWithPath:@"/tmp"]; 
__weak NSString *myString = @"123"; 

NSLog(@"myURL: %@", myURL); 
NSLog(@"myString: %@", myString); 

其結果是:

2012-07-10 19:23:49.858對myApp [56093:303] myURL:(空)

2012-07-10 19:23:49.859 myApp [56093:303] myString:123

爲什麼沒有結果的myString ==(空)

+0

我把相同的代碼放在主函數中,它打印值... – 2012-07-10 17:49:44

回答

6

這是因爲在您的示例字符串是字符串字面從未得到釋放。 你的財產不保留字符串,但由於它沒有被釋放,它仍然指向你分配的值。

,如果您已經創建使用[NSString stringWithFormat:@"hello"];那麼你會看到預期的行爲的字符串。

+0

嚴格地說,'[NSStrign stringWithFormat:@「hello」];'仍然可以返回文字字符串,但是你所說的原則是健全的 - 一個足夠長的格式字符串,你會得到一個新的,非永恆的對象。 – 2012-07-10 17:38:22

+0

有null和指向釋放內存之間有區別。 – 2012-07-10 17:46:25

+0

@InderKumarRathore:ARC的一個奇妙之處在於它在釋放對象時自動將弱引用設置爲'nil'。這就是發生在這裏的事情。 – 2012-07-10 17:48:12

-1

嘗試此

的NSLog(@ 「myURL:%@」,[myURL描述]); (@「myString:%@」,myString);}}

由於「%@」用於表示NSString而非NSURL。

+1

'NSLog()'將'description'發送給'%@'格式字符串的對象。不需要手動發送 - '%@'適用於任何Cocoa對象。 – 2012-07-10 19:53:56