iOS分類類擴充

來源:互聯網
上載者:User

標籤:區別   ext   name   格式   特性   end   多個   支援   分類   

一.分類:

1、適用範圍     當你已經封裝好了一個類(也可能是系統類別、第三方庫),不想在改動這個類了,可是隨著程式功能的增加需要在類中增加一個方法,這時我們不必修改主類,只需要給你原來的類增加一個分類。     將一個大型的類拆分成不同的分類,在不同分類中實作類別別聲明的方法,這樣可以將一個類的實現寫到多個.m檔案中,方便管理和協同開發。     分類中的方法可以只聲明,不實現,所以在協議不支援可選方法的時候(協議現在已經支援可選方法),通常把分類作為非正式協議使用。2、文法格式     檔案中的文法:
1 @interface 主類類名(分類類名)2 //不可以定義成員屬性3 @end4 5 @implementation 主類類名(分類類名)6 7 @end

     檔案名稱通常為:主類名+分類名

     調用方法時,只需要向主類引用發送訊息即可3、注意事項
  • 分類中方法的優先順序比原來類中的方法高,也就是說,在分類中重寫了原來類中的方法,那麼分類中的方法會覆蓋原來類中的方法
  • 分類中只能聲明方法,不能添加屬性變數,在運行時分類中的方法與主類中的方法沒有區別
  • 通常來講,分類定義在.h檔案中,但也可以定義.m檔案中,此時分類的方法就變成私人方法
4、如何使用定義XYZPopViewController類的分類
 1 XYZPopViewController+CatController.h檔案 2 @interfaceXYZPopViewController (CatController) 3 - (void)test; 4 @end 5  6 XYZPopViewController+CatController.m檔案 7 @implementationXYZPopViewController (CatController) 8 - (void)test { 9     NSLog(@"測試一下XYZPopViewController的分類");10 }11 @end

5.雖然不能再類別中定義成員屬性,但是也可以讓它支援添加屬性和成員變數

Category是Objective-C中常用的文法特性,通過它可以很方便的為已有的類來添加函數。但是Category不允許為已有的類添加新的屬性或者成員變數。     
一種常見的辦法是通過runtime.h中objc_getAssociatedObject / objc_setAssociatedObject來訪問和產生關聯對象。通過這種方法來類比產生屬性。

1 //NSObject+IndieBandName.h2 @interface NSObject (IndieBandName)3 @property (nonatomic, strong) NSString *indieBandName;4 @end

上面是標頭檔聲明,下面的實現的.m檔案 1 // NSObject+IndieBandName.m     2 #import "NSObject+Extension.h"

 3 #import <objc/runtime.h> 4 static const void *IndieBandNameKey = &IndieBandNameKey;     5 @implementation NSObject (IndieBandName) 6 @dynamic indieBandName; 7 
8 - (NSString *)indieBandName {
//如果屬性值是非id類型,可以通過屬性值先構造OC的id對象,在通過對象擷取非id類型屬性 9 return objc_getAssociatedObject(self, IndieBandNameKey);10 }11 12 - (void)setIndieBandName:(NSString *)indieBandName{
     //如果屬性值是非id類型,可以通過屬性值先構造OC的id對象,在通過對象擷取非id類型屬性
13  objc_setAssociatedObject(self, IndieBandNameKey, indieBandName, OBJC_ASSOCIATION_RETAIN_NONATOMIC); 
14 }
16 @end

二、擴充

1、適用範圍     擴充是分類的一種特殊形式。 2、文法格式     @interface 主類類名()     @end     擴充通常定義在主類.m檔案中,擴充中聲明的方法直接在主類的.m檔案中實現。 3、注意事項
  • 擴充中可以聲明執行個體變數,可以聲明屬性
  • 因為擴充通常定義在主類的.m檔案中,所以擴充聲明的方法和屬性通常是私人的
4、分類和擴充的區別     分類是不可以聲明執行個體變數,通常是公開的,檔案名稱是:主類名+分類名.h     擴充是可以聲明執行個體變數,是私人的,檔案名稱為:主類名_擴充標識.h,在主類的.m檔案中#import該標頭檔 5. 如何使用    定義 XYZPopViewController類的擴充    方式1、以單獨的檔案定義
1 XYZPopViewController_ExViewController.h檔案2 #import"XYZPopViewController.h"3 4 @interface XYZPopViewController()5 @property(nonatomic,strong)NSString*stringOfEx;6 - (void)testEx;7 @end
方式2、在主類的.m檔案中定義
1 XYZPopViewController.m檔案2 #import"XYZPopViewController.h"3 4 @interface XYZPopViewController()5 @property(nonatomic,strong)NSString*stringOfEx;6 - (void)testEx;7 @end

在主類的.m檔案中實現擴充定的方法

1 @implementation XYZPopViewController2 - (void)testEx {3     [email protected]"給擴充裡面定義的屬性字串賦值";4     NSLog(@"定義的屬性String是:%@",self.stringOfEx);5 }6 @end

iOS分類類擴充

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.