ViewController.m
#import "ViewController.h"
#import "Tool.h"
#import "Tool+Tool_Category.h"
#import "MyClass.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[superviewDidLoad];
//类目 延展协议
#pragma mark ----------类目--------------------
/*
类目
定义:为现有的工程的类和系统类添加新的方法
作用:在类目添加新的方法及属性和在原类中添加方法及属性是一样的,都能够被类和类的种类调用,这样可以快捷
变量地维护和开发项目。
note :如何在类目中为原类添加新的方法及属性?
*/
Tool *tool=[Toolnew];
//这是键值访问,即KVC
[tool setValue:@"Rice"forKey:@"_name"];
[tool setProperty2:@"property2"];
//调用方法
[tool function1];
[tool function2];
[tool function3];
NSLog(@"%@",tool.property2);
}
- (void)didReceiveMemoryWarning {
[superdidReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
#import <Foundation/Foundation.h>
@interface Tool : NSObject
{
NSString *_name;
}
@property (nonatomic,strong)NSString *property2;
//原类的属性
//@property(readwrite,nonatomic,strong)NSString *property1;
//原类中的方法
-(void)function1;
@end
#pragma mark----------------类目-------------------
//在类目中为原类添加新的属性及方法
/*
类目就是为己存在的类添加新的方法。但是不能添加实例变量
类目的使用场景
1.类包含了和多个方法实现,而这些方法需要不同团队的成员来实现
2.当你在使用继承类库中的类是,你不想继承该类而指向添加一些方法时。
类目能实现上面的需求,当然也有使用类目是需要注意的问题
1.类目可以访问原始类的实例变量,但不能添加实例变量,如果想添加变量,那就通过继承创建种类来实现
2.类目可以从在原始类的方法,但是不推荐这样做,这样会覆盖掉原始类的方法,如果确实要重载
。那就通过继承创建种类来实现
3.和不同接口有所区别的时,在类目的实现文件中的实例方法只能你不去调用它你不可以
不用实现声明的所有方法
*/
@interface Tool (ToolCategory)
//{
//NSString *_property2;//不能添加属性
//}
/*
在一般情况下,我们是不能向Category添加属性的,只能添加方法,但有些情况下,我们
确实需要向Category中添加属性,而且系统的API也有一些在Category添加属性
情况,那么着到底是怎么实现的呢?
IOS运行机制
ios运行机制,简单来说,就是苹果为开发者提供的一套在运行时动态床架类,属性
方法的API,他是一套纯C语言的API,使用响应的API就可以通过Category给一个原本存在的类
添加属性
*/
@property(nonatomic,strong)NSString *property2;
-(void)function2;
//重载function1
-(void)function1;//在原始类也有function1
@end
=============================================================================#pragma mark ---------------合成类目中的属性--------------------
-(void)setProperty2:(NSString *)property2
{
//Property2的设置器
/*
id object : 给那个对象的属性赋值
const void *key :属性对应的key
id value :设置属性值为value
<#objc_AssociationPolicy policy#>:使用的策略是一个枚举值。手机开发一般都是选择NONATOMIC
如下取值:
OBJC_ASSOCIATION_ASSIGN = 0, //assign策略
OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1,//retaincelue
OBJC_ASSOCIATION_COPY_NONATOMIC = 3,//copy策略
OBJC_ASSOCIATION_RETAIN = 01401,
OBJC_ASSOCIATION_COPY = 01403
*/
objc_setAssociatedObject(self,@selector(property2), property2,OBJC_ASSOCIATION_COPY_NONATOMIC);
// objc_setAssociatedObject(<#id object#>, <#const void *key#>, <#id value#>, <#objc_AssociationPolicy policy#>)
}
-(NSString *)property2
{
//访问器
returnobjc_getAssociatedObject(self,@selector(property2));
}
-(void)function1
{
NSLog(@"通过类目重载的function1");//不是输出I am funcation1 而是输出重载后的方法
}
@end
===========================================================================================在Xcode 按快捷键com+N 在左面找到iOS子类目下找到Source在右面找到Objective-C File
Next->File Type->Category
在到File->打入文件名字:Tool_Category
Tool+Tool_Category.h
#import "Tool.h"
@interface Tool (Tool_Category)
-(void)function3;
@end
=======================================================================Tool+Tool_Category.m
#import "Tool+Tool_Category.h"
@implementation Tool (Tool_Category)
-(void)function3
{
NSLog(@"I'm function3");
}
@end