類擴展 (Class Extension也有人稱為匿名分類)
- 作用:
- 能為某個類附加額外的屬性,成員變量,方法聲明
- 一般的類擴展寫到.m文件中
- 一般的私有屬性寫到類擴展
- 使用格式:
@interface Mitchell() //屬性 //方法 @end -
與分類的區別
-
分類的小括號中必須有名字
@interface 類名(分類名字) /*方法聲明*/ @end @implementation類名(分類名字) /*方法實現*/ @end - 分類只能擴充方法,不能擴展屬性和成員變量(如果包含成員變量會直接報錯)。
- 如果分類中聲明了一個屬性,那么分類只會生成這個屬性的set、get方法聲明,也就是不會有實現。
- 舉例說明:如果我們分別在,類擴展與分類中添加了兩個屬性,
類擴展與類別1.1.png
接下來在初始化方法中分別賦值,
類擴展與類別1.1.png
大家會看到在為在分類中所聲明的屬性textOne賦值的時候,崩潰了,那么我們來查看一下崩潰的原因:
類擴展與類別1.3.png
意思是說,我們所創建的對象中並沒有textOne這個屬性。也就是說雖然我們再類別中聲明屬性不會報錯,但是@property並沒有自動為我們設置的屬性生成set、get方法。
-
- 再說一下我們為什么不能包含類的 .m文件,因為這樣會重復包含另一個類的實現文件。
使用運行時的代碼如下:
@interface QKYCrmMyCustomerController (mcCate) @property (nonatomic,copy)NSString *myselfStr; @end @implementation QKYCrmMyCustomerController (mcCate) static NSString *const myStr; - (void)setMyselfStr:(NSString *)myselfStr { objc_setAssociatedObject(self, &myStr, myselfStr, OBJC_ASSOCIATION_COPY); } - (NSString *)myselfStr { return objc_getAssociatedObject(self, &myStr); } @end
文/Mitchell(簡書作者)
原文鏈接:http://www.jianshu.com/p/18d48e7f2aad
著作權歸作者所有,轉載請聯系作者獲得授權,並標注“簡書作者”。
原文鏈接:http://www.jianshu.com/p/18d48e7f2aad
著作權歸作者所有,轉載請聯系作者獲得授權,並標注“簡書作者”。
