1. 程式人生 > >iOS分類類擴展

iOS分類類擴展

str 方便 import -c 增加 stat 屬性 變量 tom

一.分類:

1、適用範圍 當你已經封裝好了一個類(也可能是系統類、第三方庫),不想在改動這個類了,可是隨著程序功能的增加需要在類中增加一個方法,這時我們不必修改主類,只需要給你原來的類增加一個分類。 將一個大型的類拆分成不同的分類,在不同分類中實現類別聲明的方法,這樣可以將一個類的實現寫到多個.m文件中,方便管理和協同開發。 分類中的方法可以只聲明,不實現,所以在協議不支持可選方法的時候(協議現在已經支持可選方法),通常把分類作為非正式協議使用。 2、語法格式 文件中的語法: 技術分享圖片
1 @interface 主類類名(分類類名)
2 //不可以定義成員屬性
3 @end
4 
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.h
2 @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 XYZPopViewController
2 - (void)testEx {
3     self.stringOfEx=@"給擴展裏面定義的屬性字符串賦值";
4     NSLog(@"定義的屬性String是:%@",self.stringOfEx);
5 }
6 @end

iOS分類類擴展