iOS Dev (48) initializer 和 convenience constructor – iPhone手機開發技術文章 iPhone軟體開發教學課程

iOS Dev (48) initializer 和 convenience constructor

  •  
  • initializer

    這個你應該很熟悉。

    - (id)initWithSomething;
    

    convenience constructor

    但是在實際運用中,我們經常用的寫法是:

    [[Foo alloc] init];
    

    如果把這貨定義成一個方法,如下:

    + (id)buildInstance;
    

    除瞭寫著簡單,還有啥區別?

    initializer 會被編譯器自動地寫成:

    - (instancetype)initWithSomething;
    

    convenience constructor 則不會被編譯器優化。所以可能會遇到問題,比如下面:

    Foo.h

    #import 
    
    @interface Foo : NSObject
    
    + (id)buildInstance;
    - (id)init;
    
    @end
    

    Foo.m

    #import Foo.h
    
    @implementation Foo
    
    + (id)buildInstance
    {
        return [[self alloc] init];
    }
    
    - (id)init
    {
        return [super init];
    }
    
    @end
    

    這時候你調用:

    [[Foo buildInstance] doSomethingElse];
    [[[Foo alloc] init] doSomethingElse];
    

    第一句不會報錯,第二句會報錯。而如果你改一下:

        + (instancetype)buildInstance
    

    這兩句都會報錯。為什麼?

    因為第一句在 buildInstance 返回值為 id 的情況下,編譯器是不會知道該把返回值當成誰,也無法找到 doSomethingElse 這個方法。

    init 被編譯器當作返回 instancetype,convenience constructor 不會

    當然還有很多其他的好處,以後慢慢體會吧。


    轉載請註明來自大銳哥的博客:https://prevention.iteye.com

發佈留言