2011-09-23 63 views
1

可能重複:
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上崩潰?

+0

日誌中的消息是什麼? –

回答

1

該值從未初始化(或設置)。它可以是任何隨機值。在調試中,它可能是零初始化的。

碰撞(或某些UB)是您應該在這種情況下預期的。所以...打開你的編譯器和靜態分析器警告,修復這些問題,並始終初始化你的值。

3

有兩個錯誤。
首先,你聲明指針str,不要設置它的值並在NSLog中使用它。
其次,你使用格式化%@,但提供整數值([str長度]),結果是未定義的。這就是爲什麼在模擬器上它打印出null,但在設備上崩潰。

-2

請參閱: 您只能通過一個無對象調用release方法。除了發佈方法,我們無法調用任何超過nil的方法。

這裏你正在調用一個指向nil的對象的方法(長度),在這種情況下它應該在發送長度消息之前指向nsstring對象。

3

你真幸運。局部變量未初始化並可能包含任何內容。很可能在OS X上,str包含0(aka nil),將-length發送到nil返回0.然後,您將長度(這是一個NSInteger)作爲NSLog的指針。

如果長度爲0時,將NSLog把它當作一個零指針如果格式指定符是%@和將打印(null)

如果str具有隨機非零值,或者當您發送長度你的程序會崩潰,或者如果它奇蹟般地工作,並返回一個非零長度,它可能會崩潰,試圖把它當作一個對象指針中的NSLog