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

[self class]的返回类型

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

    例如,是否可以执行以下操作:

    + ([self class] *) selectorName;
    

    因此,给定一个超类,例如:

    @interface MyClass : NSObject {}
    + (MyClass *) instanceOfMyClass;
    @end
    
    @implementation MyClass 
    + (MyClass *) instanceOfMyClass {
      return [[[[self class] alloc] init] autorelease];
    }
    @end
    

    在执行以下操作时,子类不需要强制转换返回值:

    @implementation MySubClass 
    + (MySubClass *) specialInstanceOfMySubClass {
      MySubClass *instance = [[self class] instanceOfMyClass];
      instance.special = YES;
      return instance;
    }
    @end
    

    换句话说,我试图公开静态方法返回类或其子类的实例这一事实。否则,子类需要知道接口中没有提供的信息。

    2 回复  |  直到 15 年前
        1
  •  0
  •   Max Seelemann    15 年前

    没有这种事。在Objective-C中输入变量基本上有两种方法:

    • :就像你已经做的那样: ClassName *
    • 匿名的 :使用泛型类型 id 对象

    + (id)instanceOfMyClass;
    

    这个 惯例 返回该类的实例。苹果公司基本上在每个班级都使用这个惯例。如果结果不同,则应将其写入此方法的文档中。苹果也是这样做的。

    另一个选择是在子类的方法中强制转换结果。

    MySubClass *instance = (MySubClass *)[[self class] instanceOfMyClass];
    
        2
  •  5
  •   Senseful    11 年前

    苹果公司推出了这个关键词 instancetype

    使用方法如下:

    @interface MyClass : NSObject {}
    + (instancetype) instanceOfMyClass;
    @end
    
    @implementation MyClass 
    + (instancetype) instanceOfMyClass {
      return [[[[self class] alloc] init] autorelease];
    }
    @end