目的C分配方法的逻辑?

问题描述:

所以我对这个网站很陌生,并不确定约定如何去问一个问题,但我只是从Objective-C开始,并且有一个与对象实例化相关的问题。目的C分配方法的逻辑?

好的,所以我知道根类NSObject有类方法alloc和init,并且这些方法传递给任何继承NSObject的类,这几乎是每个类。我知道实例化对象的典型格式是这样的:

MyObject *m = [[MyObject alloc]init];

但考虑MyObject来有自NSObject的继承了alloc和初始化方法,这个理论上也可正常工作,考虑到为MyObject和NSObject的具有相同的页头和init方法(假设类不重写它们):

MyObject *m = [[NSObject alloc] init];

而且它适用于只是实例,但是当我尝试打电话给在为MyObject类中的任何方法,一个NSException被抛出。当我将NSObject alloc切换回MyObject alloc时,它可以工作。我只是不明白为什么!这可能是一个基本问题,但有任何解释?

在此先感谢!

杰克

+0

什么是抛出的异常? – 2012-07-21 17:57:05

+0

@NSArray我相信这是一个NSInvalidArgumentException - 无法识别的选择器发送到实例(实例的十六进制地址) – 2012-07-21 18:04:46

[[NSObject alloc] init] 

创建一个NSObject的,如果你把它分配给另一个类型的变量,因此它并没有太大的意义做MyObject *m = [[NSObject alloc] init];,同时它还可以是有意义的像做MyClass *obj = [[MySubClass alloc ] init];不管,因为MySubClass也是一个MyClass。

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

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

,从而ALLOC实施创建类MyObject的一个实例。但是,如果你写[NSObject alloc];它转化为

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

所以一个普通的NSObject的实例被创建,这显然不会给你的类的消息作出响应。