为什么声明指针使其内容为nil?

时间:2011-09-23 12:43:21

标签: iphone objective-c macos pointers null

  

可能重复:
  Declared but unset variable evaluates as true?

为什么此代码适用于Mac OS

int main (int argc, const char * argv[]) 
{
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    NSString *str;
    NSLog(@"%@", [str length]);

    NSLog(@"Hello, World!");
    [pool drain];
    return 0;
}

和控制台输出

2011-09-23 15:37:17.481 Untitled1[80021:903] (null) 
2011-09-23 15:37:17.495 Untitled1[80021:903] Hello, World!

但在iPhone上崩溃了?

5 个答案:

答案 0 :(得分:3)

两个错误。
首先,声明指针str,不要设置它的值并在NSLog中使用它 其次,使用格式化%@,但提供整数值([str length]),结果是未定义的。这就是为什么在模拟器上打印null,但在设备上崩溃。

答案 1 :(得分:3)

你很幸运。局部变量未初始化,可能包含任何内容。很可能在OS X上,str包含0(也就是nil),将-length发送到nil返回0.然后,您将长度(NSInteger)视为{{1的指针}}。

如果长度为0,如果格式说明符为NSLog,则NSLog会将其视为零指针,并将打印%@

如果(null)具有随机非零值,则当您发送长度时程序将崩溃或者如果它奇迹般地工作并返回非零长度,它可能会崩溃尝试将其视为对象指针在NSLog中

答案 2 :(得分:1)

永远不会初始化(或设置)该值。它可以是任何随机值。在调试中,它可能是零生命的。

在这种情况下,你应该期待崩溃(或一些UB)。所以......打开你的编译器和静态分析器警告,修复问题,并始终初始化你的值。

答案 3 :(得分:0)

试试这个。

     NSString *str=@"";

NSLog(@"%d", [str length]);

答案 4 :(得分:-2)

看, 您只能在nil对象上调用release方法。除了发布方法,我们不能在任何方法上调用任何方法。

这里你调用一个指向nil的对象的方法(长度),在这种情况下,它应该在发送长度消息之前指向nsstring对象。