【问题标题】:Objective C Logic of alloc method?alloc方法的Objective C逻辑?
【发布时间】:2012-07-20 15:04:09
【问题描述】:

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

提前致谢!

杰克

【问题讨论】:

  • 抛出的异常是什么?
  • @NSArray 我确定这是一个 NSInvalidArgumentException - 无法识别的选择器发送到实例(实例的十六进制地址)

标签: objective-c


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:
    [[NSObject alloc] init]
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-05
      • 2015-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-30
      • 2010-11-22
      • 1970-01-01
      相关资源
      最近更新 更多