为什么NSLog会像这样打印?

时间:2014-03-06 11:03:28

标签: ios objective-c

代码行:

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

}

@implementation ViewController

- (void)viewDidLoad
{
[super viewDidLoad];

lbl_FirstName.text=@"XFirst";
lbl_LastName.text=@"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)。

4 个答案:

答案 0 :(得分:1)

看来内存中的下一个对象恰好是“XLast”的值。

我推测的是:

  • 您创建了一个字符串:@"XLast"
  • 该程序尝试将此值分配给lbl_LastName.text,但由于lbl_LastName为零,因此失败。
  • NSLog正确地打印出lbl_LastName.text是ni的事实,但由于你有两个%@,它还打印出内存中的下一个对象。这恰好是您刚刚分配的字符串:@"XLast"

这可能是未定义的行为,每次都可能不一样。

答案 1 :(得分:1)

来自documentation,它说:

  

在格式字符串中,'%'字符宣布一个值的占位符,后面的字符决定了预期值的类型以及如何格式化它。

所以,可能,它已经为你的字符串分配/宣布了两个占位符。并且,它找到第一个占位符的值。什么都没找到。因此,它显示(null)并找到第二个占位符的值并相应地打印它。这应该是恕我直言..

答案 2 :(得分:0)

嘿为什么你要为这样的多个变量打印值添加超过%@。

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

如果您在控制台中获得空值,请检查您的插座连接

答案 3 :(得分:0)

说明符%@

Objective-C对象,打印为descriptionWithLocale返回的字符串:如果可用,或者说是其他描述。也适用于CFTypeRef对象,返回CFCopyDescription函数的结果。

https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Strings/Articles/formatSpecifiers.html