ios標(biāo)識符

一、NS_DESIGNATED_INITIALIZER

用來修飾init方法,被修飾的方法稱為designated initializer;沒有被這個修飾的init方法稱為convenience initializer

參考1對之的說明為

31.A designated initializer must call (viasuper) a designated initializer of the superclass. WhereNSObjectis the superclassthisis just [superinit].

2.Any convenience initializer must call another initializer in theclass- which eventually leads to a designated initializer.

3.Aclasswith designated initializers must implement all of the designated initializers of the superclass.

解釋下就是

1.designated initializer 必須調(diào)用父類的designated initializer (最終指向也會有警告)

2.convenience initializer最終必須指向一個designated initializer

3.有designated initializer的類必須實(shí)現(xiàn)父類的designated initializer方法

補(bǔ)充點(diǎn)

1.繼承性,當(dāng)子類里面沒有其他的init方法時,繼承父類的designated initializer;如果子類有其他的init方法,則父類的 designated initializer 方法 都變成了? convenience initializer

2.NSCoding 的 initWithCoder: 是一個 designated initializer方法

3.參考2最后提出了一個疑問

@interfaceA : NSObject-(instancetype)initDesignated NS_DESIGNATED_INITIALIZER;-(instancetype)initUndesignated;@end@implementationA-(instancetype)init

{return([self initUndesignated]);

}-(instancetype)initDesignated

{return(self =[super init]);

}-(instancetype)initUndesignated

{return(self =[self initDesignated]);

}@end@interfaceB : A-(instancetype)initDesignatedB NS_DESIGNATED_INITIALIZER;-(instancetype)initUndesignatedB;@end@implementationB-(instancetype)initDesignated

{return[self initUndesignatedB];

}-(instancetype)initDesignatedB

{return(self =[super initDesignated]);

}-(instancetype)initUndesignatedB

{return([self initDesignated]);

}@end

參考2疑問為什么 最后一個函數(shù) initUndesignatedB 里面這樣調(diào)用不會有警告,其實(shí)很好理解。

1.因?yàn)閟elf沒有實(shí)現(xiàn)initUndesignated,所以會調(diào)用 super 的 initUndesignated方法

2.super 的 initUndesignated 需要調(diào)用 initDesignated 方法

3.子類實(shí)現(xiàn)了 initDesignated 方法,所以最終回調(diào)用到 self 的 initDesignated 方法

這當(dāng)然不會有什么問題了

二、NS_UNAVAILABLE

用來修飾所有的方法,表示這個類的這個方法是不可用的。

一個很好的用法就是配合上面的 NS_DESIGNATED_INITIALIZER 修飾符。因?yàn)楦割惖?designated initializer 必須在子類實(shí)現(xiàn),而如果子類只希望有另一種 designated initializer 存在,就可以把父類的 designated initializer 申明為 NS_UNAVAILABLE,這樣就不用去實(shí)現(xiàn),也避免出現(xiàn)多個init 方法。

三、NS_REQUIRES_SUPER

用來修飾所有方法,表示子類override父類的方法時,必須在方法內(nèi)部調(diào)用super的這個方法。

如果子類真的不想去調(diào)用 super 用 NS_REQUIRES_SUPER 修飾的方法,又不想出現(xiàn)警告,那么可以用下面的方式處理

#pragmaclang diagnostic push#pragmaclang diagnostic ignored "-Wobjc-missing-super-calls"方法實(shí)現(xiàn)#pragmaclang diagnostic pop

四、無修飾

如果是init方法,那么這個init方法就是 convenience initializer。

參考:

1.http://useyourloaf.com/blog/xcode-6-objective-c-modernization/

2.https://yq.aliyun.com/articles/5847

3.http://blog.jobbole.com/65762/

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

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

  • 禪與 Objective-C 編程藝術(shù) (Zen and the Art of the Objective-C C...
    GrayLand閱讀 1,868評論 1 10
  • Designated Initializer,指定初始化器。 每個類的初始化過程,應(yīng)該是按照從子類到父類的順序,依...
    升級打怪啊怪閱讀 493評論 0 1
  • 此間少年 日起東天壓宿嶂,少年羈旅鬢微霜。 閑情豈被封侯誤,不負(fù)經(jīng)年好時光
    BRS閱讀 337評論 6 2
  • 你,有壓力嗎? 生活、工作、家庭、孩子、婚姻、社交、學(xué)習(xí)。。。 在這高速運(yùn)轉(zhuǎn)的環(huán)境里,無論來自哪方面的壓力,都會或...
    子夜在路上閱讀 225評論 0 0
  • 宇宙,自古以來一直是一個很神秘的詞語。我們生活在地球上,而地球只不過是宇宙所包含的眾多天體中的一個。人類自誕生以來...
    萬云帆閱讀 539評論 0 0

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