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

时间:2011-04-03 02:52:59

标签: iphone macos memory-management null

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

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

#import <Foundation/Foundation.h>

@interface Foo : NSObject {

}

@end

和Foo.m:

#import "Foo.h"

@implementation Foo

@end

要在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;
}

此程序输出:

0x0

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

感谢。

3 个答案:

答案 0 :(得分:8)

您没有向nil变量发送版本。就像在C中一样,

Foo *myFoo; 

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

答案 1 :(得分:1)

在Objective-C中,当您在nil指针上调用方法时,没有任何反应。

但是,在上面的代码中,您没有将指针设置为nil,因此您将消息发送到内存位置。如果您的应用程序无法访问该内存位置,则会因EXC_BAD_ACCESS消息而崩溃。

如果发生崩溃,应该停止添加:Foo *myFoo = nil;

答案 2 :(得分:1)

这里的底线是这一行:

Foo *myFoo;

以上创建Foo实例。它所做的就是声明一个变量,如果你创建和初始化这样一个实例,它可以用来引用它。要声明变量创建实例,您需要执行以下操作:

Foo *myFoo = [[Foo alloc] init];

此外,这一行:

[myFoo description];

这一点都没有。 -description方法返回一个字符串,但是你没有将返回的字符串存储在任何地方,或者用它做任何其他事情。

我可以继续,但我不会 - 我的建议是去Apple的网站阅读他们的Learning Objective-C教程,以及从那里链接的其他文章。这样做是学习语言的一种更有效的方式,而不仅仅是制作东西并期望编译器理解它。