打开Xcode -> 选择IOS -> Application -> Single View Application -> 然后按next
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