本文章翻译自官方文档
使用instancetype
关键字作为方法的返回值,能够返回一个类的实例。比如alloc
,init
等方法。
在一个合适的地方使用instancetype
取代id
将使你的代码更加安全。看下下面的代码:
@interface MyObject : NSObject
+ (instancetype)factoryMethodA;
+ (id)factoryMethodB;
@end
@implementation MyObject
+ (instancetype)factoryMethodA { return [[[self class] alloc] init]; }
+ (id)factoryMethodB { return [[[self class] alloc] init]; }
@end
void doSomething() {
NSUInteger x, y;
x = [[MyObject factoryMethodA] count]; // Return type of +factoryMethodA is taken to be "MyObject *"
y = [[MyObject factoryMethodB] count]; // Return type of +factoryMethodB is "id"
}
方法+factoryMethodA
的返回值是instancetype
类型,即MyObject *
类型。由于MyObject
这个类没有-count
这个方法,所以编译器会在x
行给出这么一个警告:
main.m: ’MyObject’ may not respond to ‘count’
然而,由于方法+factoryMethodB
的返回值是id
类型,所以编译器在y
行没有任何警告。
还有下面这个例子:
@interface MyObjectSubclass : MyObject
@end
void doSomethingElse() {
NSString *aString = [MyObjectSubclass factoryMethodA];
}
编译器会报如下警告:
main.m: Incompatible pointer types initializing ’NSString *’ with an expression of type ’MyObjectSubclass *’
这两个例子就能大致说明instancetype
和id
的区别了。
结束语
翻译本文的目的,最主要的目的是让我自己慢慢适应看官方文档,因为咱们学习iOS的所有权威的资料都来自apple开发者网站,所以看文档也是最直接和最有效的方式。
最后,内容有翻译错误和不准确的地方请大家帮我指正,谢谢。