有人可以在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上它会直接崩溃。
感谢。
答案 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教程,以及从那里链接的其他文章。这样做是学习语言的一种更有效的方式,而不仅仅是制作东西并期望编译器理解它。