返回类型[self class]

时间:2010-08-27 08:35:11

标签: iphone objective-c

是否可以将objective-c中选择器的返回类型设置为类本身?

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

+ ([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 个答案:

答案 0 :(得分:5)

Apple正是出于这个原因引入了关键字instancetype

您可以按如下方式使用它:

@interface MyClass : NSObject {}
+ (instancetype) instanceOfMyClass;
@end

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

答案 1 :(得分:0)

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

  • static :就像你已经做过的那样:ClassName *
  • 匿名:使用可与任何对象匹配的通用类型id

所以在你的情况下,你可以这样做一个方法声明:

+ (id)instanceOfMyClass;

约定是返回该类的实例。 Apple基本上在每个类中使用此约定。如果结果不同,则应将其写入此方法的文档中。这也是Apple这样做的方式。

另一种选择是将结果转换为子类'method。

MySubClass *instance = (MySubClass *)[[self class] instanceOfMyClass];