Objective-C语言——Category类目
2016-01-02 14:15
435 查看
打开Xcode -> 选择IOS -> Application -> Single View Application -> 然后按next
2.如果你创建了工程那快捷键(com-shift-N) -> 选择IOS -> Application -> Single View Application -> 然后按next
在工程项下个找到ViewController.m文件
Tool.h
Tool.m
在Xcode 按快捷键com+N 在左面找到iOS子类目下找到Source在右面找到Objective-C File
Next -> File Type -> Category
在到File -> 打入文件名字:Tool_Category
Tool+Too_Category.h
Tool+Too_Category.m
ViewController.m
运行结果
2016-01-02 14:14:55.253 OC_LX_09_01[2991:85890]
通过类目重载的 fuanction1
2016-01-02 14:14:55.254 OC_LX_09_01[2991:85890] Rick
2016-01-02 14:14:55.254 OC_LX_09_01[2991:85890] I'm function2
2016-01-02 14:14:55.254 OC_LX_09_01[2991:85890] property = property2
2016-01-02 14:14:55.254 OC_LX_09_01[2991:85890] I'm fuanction3
2.如果你创建了工程那快捷键(com-shift-N) -> 选择IOS -> Application -> Single View Application -> 然后按next
在工程项下个找到ViewController.m文件
Tool.h
#import <Foundation/Foundation.h> @interface Tool : NSObject { //原始类 NSString *_name; } //原类的属性 @property (nonatomic,strong) NSString *property1; -(void)function1; #pragma mark------------类目----------- //在类目中为原类添加新的属性及方法 /* 类目就是为已存在的类添加新的方法。但是不能添加实例变量。 类目的使用场景 1.类包含了很多个方法实现,而这些方法需要不同团队的成员来实现。 2.当你使用基础类库中的类时,你不想继承这些而指向添加一些方法时。 类目能实现上面的需求,当然也有使用类目时需要注意的问题 1.类目可以访问原始类的实例变量,但不能添加实例变量,如果想添加变量,那就通过继承创建子类来实现 2.类目可以重载原始类的方法,但是不推荐这么做,这样会覆盖掉原始类的方法,如果确定要重载,那就要通过继承创建子类来实现 3.和普通接口有所区别的是,在类目的实现文件中的实例方法只要你不去调用它你可以不用实现声明的所有方法。 */ @end @interface Tool (ToolCategory); //类目 //{ //NSString *_property2;//不能添加属性 //} @property (nonatomic,strong)NSString *property2; @property (nonatomic,strong)NSString *property3; /* 在一般情况下,我们是不能向Category添加属性的,只能添加方法,但有些情况下,我们确定需要向 Category 中添加属性,而且系统的 API 也有一些在 Category 添加属性的情况,那么这到底是怎么实现的呢? iOS 运行时机制 iOS 运行时机制,简单来说,就是苹果为开发者提供的一套在运行时动态创建类、属性、方法的 API,它是一套纯 C语言的 API,使用相应地 API 就可以通过 Category 给一个原本存在的类添加属性 */ -(void)function2; //通过类目重载原始类的方法 -(void)function1; @end
Tool.m
<strong>#import "Tool.h" #import <objc/runtime.h> @implementation Tool -(void)function1 { NSLog(@"I'm function1"); } @end @implementation Tool (ToolCategory) -(void)function2 { //类目可以访问原始类的实例变量 NSLog(@"%@",_name); NSLog(@"I'm function2"); NSLog(@"property = %@",[self property2]); } #pragma mark ---------合成类目中的属性--------------------- -(void)setProperty2:(NSString *)property2 { /* : 给哪个对象的属性赋值 <#const void *key#> :属性对应的 key <#id value#> :设置属性值为 value <#objc_AssociationPolicy policy#> :使用的策略,是一个枚举器,手机开发一般都选择 NONATOMUC 如下取值: OBJC_ASSOCIATION_ASSIGN = 0, //assign 策略 OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1, //retain 策略 OBJC_ASSOCIATION_COPY_NONATOMIC = 3, //copy 策略 OBJC_ASSOCIATION_RETAIN = 01401, OBJC_ASSOCIATION_COPY = 01403<#id object#> */ objc_setAssociatedObject(self, @selector(property2), property2, OBJC_ASSOCIATION_RETAIN_NONATOMIC); } -(NSString *)property2 { return objc_getAssociatedObject(self, @selector(property2)); } -(void)function1 { NSLog(@"通过类目重载的 fuanction1");//翻盖原始类 function1 } @end</strong>
在Xcode 按快捷键com+N 在左面找到iOS子类目下找到Source在右面找到Objective-C File
Next -> File Type -> Category
在到File -> 打入文件名字:Tool_Category
Tool+Too_Category.h
<strong>#import "Tool.h" @interface Tool (Too_Category) -(void)function3; @end </strong>
Tool+Too_Category.m
<strong>#import "Tool+Too_Category.h" @implementation Tool (Too_Category) -(void)function3 { NSLog(@"I'm fuanction3"); } @end </strong>
ViewController.m
<strong>#import "ViewController.h" #import "Tool.h" #import "Tool+Too_Category.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; //类目、延展、协议 #pragma mark-------------类目------------- /* 类目 定义:为现有工程中的类和系统类添加新的方法 作用:在类目中添加新的方法及属性 和 在原类中添加及属性是一样的,都能够被类和类的子类调用,这样可以快速便利地维护和开发项目 note:如何在类目中为原类添加新的方法及属性? */ Tool *tool = [Tool new]; //这时键值访问,即 KVC // 给变量赋值 [tool setValue:@"Rick" forKey:@"_name"]; [tool setProperty2:@"property2"]; [tool function1]; [tool function2]; [tool function3]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end</strong>
运行结果
2016-01-02 14:14:55.253 OC_LX_09_01[2991:85890]
通过类目重载的 fuanction1
2016-01-02 14:14:55.254 OC_LX_09_01[2991:85890] Rick
2016-01-02 14:14:55.254 OC_LX_09_01[2991:85890] I'm function2
2016-01-02 14:14:55.254 OC_LX_09_01[2991:85890] property = property2
2016-01-02 14:14:55.254 OC_LX_09_01[2991:85890] I'm fuanction3
相关文章推荐
- ES6学习——新的语法:对象字面量扩展(Object Literal Extensions)
- Objective-C轻量级泛型
- [2]姥爷幽默谈Objective-C(数组和字典)
- Super Object Toolkit (支持排序)
- Objective-C History
- Objective-c语言_错误(视图多重关联)
- setValue: forKey 和 setObject: forkey的区别
- NSDictionary使用 ... enumerateKeysAndObjectsUsingBlock
- 【Objective-C学习记录】第三十天
- [Object C]_[初级]_[Object C之内存管理]
- 【Objective-C学习记录】第二十九天
- NSObject + NSCoding Category
- Objective-C之KVC、KVO
- Thread的join()方法和Object的wait(),notify(),notifyAll()方法
- Git CMD - show: Show various types of objects
- jdbcTemplate.queryForObject 方法注意
- Objective-C编码规范:26个方面解决iOS开发问题
- MyBatis中对List<Object> 对象List的批处理插入操作
- Objective-C 笔记 字符串操作
- Git CMD - fetch: Download objects and refs from another repository