本文章翻譯自官方文檔
使用instancetype
關(guān)鍵字作為方法的返回值球拦,能夠返回一個(gè)類的實(shí)例蔚鸥。比如alloc
,init
等方法动雹。
在一個(gè)合適的地方使用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
這個(gè)類沒(méi)有-count
這個(gè)方法亩码,所以編譯器會(huì)在x
行給出這么一個(gè)警告:
main.m: ’MyObject’ may not respond to ‘count’
然而季率,由于方法+factoryMethodB
的返回值是id
類型,所以編譯器在y
行沒(méi)有任何警告描沟。
還有下面這個(gè)例子:
@interface MyObjectSubclass : MyObject
@end
void doSomethingElse() {
NSString *aString = [MyObjectSubclass factoryMethodA];
}
編譯器會(huì)報(bào)如下警告:
main.m: Incompatible pointer types initializing ’NSString *’ with an expression of type ’MyObjectSubclass *’
這兩個(gè)例子就能大致說(shuō)明instancetype
和id
的區(qū)別了飒泻。
結(jié)束語(yǔ)
翻譯本文的目的,最主要的目的是讓我自己慢慢適應(yīng)看官方文檔吏廉,因?yàn)樵蹅儗W(xué)習(xí)iOS的所有權(quán)威的資料都來(lái)自apple開(kāi)發(fā)者網(wǎng)站泞遗,所以看文檔也是最直接和最有效的方式。
最后席覆,內(nèi)容有翻譯錯(cuò)誤和不準(zhǔn)確的地方請(qǐng)大家?guī)臀抑刚氛蓿x謝。