在Objective-c中将发布发送到NIL

iPa*_*rJr 0 iphone macos null memory-management

有人可以在mac计算机上然后在iphone设备上向我解释这个程序的输出.

我创建了一个不含任何东西的普通Foo类,Foo.h:

#import <Foundation/Foundation.h>

@interface Foo : NSObject {

}

@end
Run Code Online (Sandbox Code Playgroud)

和Foo.m:

#import "Foo.h"

@implementation Foo

@end
Run Code Online (Sandbox Code Playgroud)

要在Mac上测试它,我使用这个main.m:

#import "Foo.h"

int main(int argc, const char *argv[]) {

  NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    Foo *myFoo; 

    [myFoo description];
    printf("%p\n", myFoo);
    [myFoo release];

    [pool drain];

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这个程序输出:

0x0
Run Code Online (Sandbox Code Playgroud)

但是在iphone上它会直接崩溃.

谢谢.

Ano*_*mie 8

你没有发送版本到nil变量.就像在C中一样

Foo *myFoo; 
Run Code Online (Sandbox Code Playgroud)

创建一个未初始化的堆栈变量,它可以包含任何垃圾值.在你的Mac上,它可能会发生值为0(零),而在iPhone上它会发生一些导致崩溃的其他值.

  • 不,你错了,Gallois.`Foo*x`是一个堆栈上的指针*,通常指向*到堆.因此,`x`本身(不是指向的对象)的值未初始化. (3认同)