0

所以我是这个网站的新手,不太确定如何提出问题的约定是什么,但我只是从 Objective-C 开始,并且有一个与对象实例化有关的问题。

好的,所以我知道根类 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 时,它可以工作。我只是不明白为什么!这可能是一个基本问题,但有什么解释吗?

提前致谢!

杰克

4

2 回答 2

3

逻辑是一样的,但是传递给消息实现的类对象alloc不一样。在第一种情况下,编译器将您的代码转换为:

objc_msgSend([MyObject class], @selector(alloc)];

因此 alloc 的实现创建了一个类的实例MyObject。但是,如果你写[NSObject alloc];它会变成

objc_msgSend([NSObject class], @selector(alloc)];

所以创建了一个普通的 NSObject 实例,它显然不会响应你的类的消息。

于 2012-07-21T17:56:52.880 回答
2
[[NSObject alloc] init]

创建一个 NSObject,不管你是否将它分配给另一个类型的变量,所以这样做没有多大意义MyObject *m = [[NSObject alloc] init];,而做类似的事情可能有意义MyClass *obj = [[MySubClass alloc ] init];,因为 MySubClass 也是 MyClass。

于 2012-07-21T17:55:46.683 回答