iOS - 類擴展與分類的區別


類擴展 (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
著作權歸作者所有,轉載請聯系作者獲得授權,並標注“簡書作者”。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM