所以我是这个网站的新手,并不确定如何提出问题的约定,但我只是从Objective-C开始,并且有一个与实例化对象有关的问题。 / p>
好的,所以我知道根类NSObject有类方法alloc和init,并且这些方法被传递给任何继承NSObject的类,这几乎是每个类。我知道实例化对象的典型格式是这样的:
MyObject *m = [[MyObject alloc]init];
但是考虑到MyObject具有从NSObject继承的alloc和init方法,考虑到MyObject和NSObject具有相同的alloc和init方法(假设类没有覆盖它们),理论上这也可以工作:
MyObject *m = [[NSObject alloc] init];
它只适用于实例化,但是当我尝试调用MyObject类中的任何方法时,会抛出NSException。当我将NSObject alloc切换回MyObject alloc时,它可以工作。我只是不明白为什么!这可能是一个基本问题,但有任何解释吗?
提前致谢!
杰克答案 0 :(得分:3)
逻辑是相同的,但传递给消息alloc
的实现的类对象不是。在第一种情况下,编译器将您的代码转换为:
objc_msgSend([MyObject class], @selector(alloc)];
因此alloc的实现创建了类MyObject
的实例。但是,如果你写[NSObject alloc];
,它就会变成
objc_msgSend([NSObject class], @selector(alloc)];
因此创建了一个简单的NSObject实例,显然不会响应您的类的消息。
答案 1 :(得分:2)
[[NSObject alloc] init]
创建一个NSObject,无论你是否将它分配给另一个类型的变量,所以做MyObject *m = [[NSObject alloc] init];
没有多大意义,尽管做MyClass *obj = [[MySubClass alloc ] init];
之类的事情是有意义的,因为MySubClass也是MyClass。