2014-03-06 229 views
1

行代碼:爲什麼NSLog打印像這樣?

@interface ViewController(){ 
IBOutlet UILabel *lbl_FirstName; 
IBOutlet UILabel *lbl_LastName; 

} 

@implementation ViewController 

- (void)viewDidLoad 
{ 
[super viewDidLoad]; 

[email protected]"XFirst"; 
[email protected]"XLast"; 

NSLog(@"First Name: %@",lbl_FirstName.text); 
NSLog(@"Last Name: %@ %@",lbl_LastName.text); 

} 

結果:

First Name: XFirst 
Last Name: (null) XLast 

問題: *爲什麼第二個的NSLog聲明打印這樣的?

我知道(null)的原因,因爲我沒有給我的.xib中的lbl_Lastname提供任何參考。但是我不知道在(null)之後打印的原因。

+0

的NSLog(@ 「姓:%@%@」,lbl_LastName.text); 爲什麼你有%@兩次?您是否試過 NSLog(@「Last Name:%@」,lbl_LastName.text); NSLog(@「Last Name:%@%@」,lbl_LastName.text,lbl_LastName.text); ? –

+0

現在只有我來iPhone開發。所以我試着玩樂,我得到了這個結果。技術上我不知道2nd NSLog語句的結果。那我爲什麼問。 FUNNY的等級爲+10。 –

+0

那條線上的Xcode沒有黃色警告嗎? – user523234

回答

1

看來內存中的下一個對象碰巧是「XLast」的值。

我推測的情況是:

  • 您創建一個字符串:@"XLast"
  • 程序試圖將此值分配給lbl_LastName.text,但由於lbl_LastName是零,它失敗。
  • NSLog正確打印出lbl_LastName.text爲ni的事實,但由於您有兩個%@,它還會打印出內存中的下一個對象。這恰好是您剛剛分配的字符串:@"XLast"

這可能是未定義的行爲,它可能每次都不一樣。

+0

我認爲你是對的。如果在第二個之後添加另一個「%@」,則可以使程序崩潰。但是如果你再聲明一個變量,比如'NSString * test = @「XTest」;',第三個'%@'也會被打印出來(在我的測試中我得到了一個對視圖控制器的引用)。這絕對是一個奇怪的問題:) – Romain

1

documentation,它說:

在格式字符串,一個「%」字符宣佈一個佔位符的值,與後面確定一種價值預期,以及如何對其進行格式化字符。

因此,它可能會爲您的字符串分配/通知兩個佔位符。並且,它找到了第一個佔位符的價值。找不到任何東西。因此,它顯示(null)並找到第二個佔位符的值並相應地打印它。這應該是這種情況下恕我直言..

0

哎爲什麼你添加超過%@多於一個像這樣的可變打印值。

NSLog(@"Last Name: %@",lbl_LastName.text); 

如果你正在控制檯空值@

Objective-C的對象,印刷由descriptionWithLocale返回的字符串的檢查您的出口連接

+0

你正確。但是討論一下,爲什麼NSLog在控制檯上打印「XLast」,即使我沒有參考它。 –

+0

哈哈,當你編譯你的程序時,它會將你的lbl_LastName.text中的XLast值存儲並打印出來。如果你沒有參考它並不意味着它不會打印。它不會顯示在您的視圖中,但它會打印它 – morroko

+0

然後爲什麼它打印(空)的第一個「%@」。想想看。 –