instancetype

本文章翻譯自官方文檔

使用instancetype關(guān)鍵字作為方法的返回值,能夠返回一個類的實例。比如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 *’

這兩個例子就能大致說明instancetypeid的區(qū)別了。

結(jié)束語

翻譯本文的目的,最主要的目的是讓我自己慢慢適應(yīng)看官方文檔,因為咱們學(xué)習(xí)iOS的所有權(quán)威的資料都來自apple開發(fā)者網(wǎng)站,所以看文檔也是最直接和最有效的方式。

最后,內(nèi)容有翻譯錯誤和不準(zhǔn)確的地方請大家?guī)臀抑刚?,謝謝。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容