标签:
一.分类:
1 @interface 主类类名(分类类名) 2 //不可以定义成员属性 3 @end 4 5 @implementation 主类类名(分类类名) 6 7 @end
文件名通常为:主类名+分类名
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 XYZPopViewController_ExViewController.h文件 2 #import"XYZPopViewController.h" 3 4 @interface XYZPopViewController() 5 @property(nonatomic,strong)NSString*stringOfEx; 6 - (void)testEx; 7 @end
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
标签:
原文地址:http://www.cnblogs.com/cy568searchx/p/5871291.html