代码之家  ›  专栏  ›  技术社区  ›  Richard J. Ross III

Objective-C调用特定类方法

  •  2
  • Richard J. Ross III  · 技术社区  · 15 年前

    我有一个类在初始化器中有这个:

    @implementation BaseFooClass
    
    -(id) init
    {
         if (self = [super init])
         {
              // initialize instance variables that always need to start with this value
         }
    
         return self;
    }
    
    -(id) initWithSomeInt:(int) someInt
    {
         if (self = [self init]) // <-- I need to make sure that I am calling BaseFooClass's init here, not SubFooClass's, does that make sense?
         {
              self.someInt = someInt;
         }
    
         return self;
    }
    
    @end
    

    一切都很好。我的问题是当我实现子类时:

    @implementation SubFooClass
    
    -(id) init
    {
         return [self initWithSomeInt:0];
    }
    
    -(id) initWithSomeInt:(int) someInt
    {
    
         if (self = [super init]) // <--- Infinite loop (stack overflow :) )
         {
              // initialize other variables
         }
    }
    
    @end
    

    BaseFooClass init SubFooClass 初始 .

    我无法更改对象初始化的方式,因为我正在将一个项目从C#转换为在iPad应用程序中使用。

    编辑:

    @interface BaseFooClass : NSObject
    
    // implicit from NSObject
    // -(id) init;
    
    -(id) initWithSomeInt:(int) someInt;
    
    // more methods
    
    @end
    
    @interface SubFooClass : BaseFooClass
    
    // implicit from NSObject
    // -(id) init;
    
    // implicit from BaseFooClass
    //-(id) initWithSomeInt:(int) someInt;
    
    
    @end
    
    2 回复  |  直到 11 年前
        1
  •  3
  •   Jason Coco superfell    15 年前

    Objective-C不能以这种方式工作,因为运行时将方法转换为函数调用。Self始终是已分配类的实例,即使在调用超级类的方法时也是如此。您需要为BaseClassFoo创建指定的初始值设定项并始终执行该操作。所以你应该这样做:

    @implementation BaseFooClass
    
    -(id) init
    {
      return [self initWithSomeInt:0]; // redirect super class's designated initializer
    }
    
    -(id) initWithSomeInt:(int) someInt
    {
      if ((self = [super init])) // Designated initializer always calls into super class's designated initializer (in this case, NSObject's designated initializer is init
      {
        self.someInt = someInt;
      }
    
      return self;
    }
    
    @end
    
    @implementation SubFooClass
    
    // Here we don't override init because our super class's designated initializer
    // is initWithSomeInt:
    // -(id) init
    // {
    //   return [self initWithSomeInt:0];
    // }
    
    // we override this because it's our superclass's designated initializer, plus it
    // is ours as well
    -(id) initWithSomeInt:(int) someInt
    {
      if ((self = [super initWithSomeInt:someInt]))
      {
        // initialize other sub-class specific variables
      }
    }
    
    @end
    
        2
  •  1
  •   nacho4d    15 年前

    你必须打电话给苏门特:苏门特];在子类的init方法中。 ;)

    我觉得奇怪的是你试图在iniWithSomeInt中调用init。通常的做法是调用[super initWi苏门特:苏门特]在子类的initIthSomeInt方法中,并更改if子句中所需的内容。

    推荐文章