一、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/