是否可以将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
换句话说,我试图揭露静态方法返回类或其子类的实例这一事实。否则,子类需要知道界面中未提供的信息。
谢谢!
答案 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中基本上有两种输入变量的方法:
ClassName *
id
所以在你的情况下,你可以这样做一个方法声明:
+ (id)instanceOfMyClass;
约定是返回该类的实例。 Apple基本上在每个类中使用此约定。如果结果不同,则应将其写入此方法的文档中。这也是Apple这样做的方式。
另一种选择是将结果转换为子类'method。
MySubClass *instance = (MySubClass *)[[self class] instanceOfMyClass];