目标C alloc方法的逻辑?

时间:2012-07-21 17:52:31

标签: objective-c

所以我是这个网站的新手,并不确定如何提出问题的约定,但我只是从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时,它可以工作。我只是不明白为什么!这可能是一个基本问题,但有任何解释吗?

提前致谢!

杰克

2 个答案:

答案 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。