2014-03-06 160 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

然后为什么它打印(空)的第一个“%@”。想想看。 –