代码之家  ›  专栏  ›  技术社区  ›  Pablo

在某些情况下,Cocoa亚类意味着没有ivar亚类?

  •  0
  • Pablo  · 技术社区  · 15 年前

    这个问题通常来自 self = [super init] .

    如果我是NSSomething的子类,在init的方法中 self=[超级初始化] 返回不同类的对象,这是否意味着我不能在我的子类中拥有自己的ivar,仅仅因为 self 会指向不同的班级吗?

    如果我的陈述有误,请举出一些例子,不胜感激。

    @implementation Base
    -(id) init
    {
        return [NSNumber numberWithBool:YES];
    }
    @end
    
    @interface Child : Base
    {
    int myVeryOwnVar;
    }
    - (id) init;
    - (void) dump;
    @end
    @implementation Child
    - (id) init
    {
    self = [super init];
    myVeryOwnVar = 5;
    
    return self;
    }
    @end
    
    Child *p = [[Child alloc] init];
    [p dump];
    

    这显然是在向发送消息时崩溃的 p 对象,因为现在 NSNumber 不提供转储消息。所以我失去了对myVeryOwnVar的控制,在更糟糕的情况下,可能会出现漏洞和崩溃。

    2 回复  |  直到 15 年前
        1
  •  1
  •   Joonas Trussmann    15 年前

    简言之,什么时候 [super init] 调用时,实际上有一个隐藏参数( self ),这是由类设置的对象 alloc . ivar已经存在了,但是你传递了它们所连接的对象( 自己 )没有明确地这样做。 init 没有 设置ivar,而是用值初始化它们。

    自己 初始化 接到电话 [超级初始化] 自己 nil .

    有关更详细(可能更准确)的描述,请参阅 http://cocoawithlove.com/2009/04/what-does-it-mean-when-you-assign-super.html

        2
  •  1
  •   Nick Moore Wain    15 年前

    这个 self = [super init] 不会返回不同类的对象,尽管它可以返回 实例 但是,它会的