OC_类目(Category)、延展(extension)、协议(Protocol)

类目:

定义:为现有工程中的类和系统类添加新的方法
作用:在类目中添加新的方法及属性和原类中添加方法和属性是一样的,都能被类和该类的子类调用,这样可以快速便利维护和开发项目。

@implementation ViewController
-(void)viewDidLoad{
[super viewDidLoad];
}

Tool *tool = [[Tool alloc]init];
[tool function1];
[tool setValue:@"Leee" forKey:@"_name"];

tool.property2 = @"property2";
[tool function2];
[tool function3];

/*
非正式协议:NSObject的类目声明称为非正式协议
创建一个NSObject的类目而不实现称为“创建一个非正式协议”。
*/

MyClass *myClass = [MyClass new];

//respondsToSelector:(SEL)aSelector 这个方法可以检查当前对象是否响应aSelector方法

if([myClass respondsToSelector:@selector(test1)]){
    [myClass test1];
}
if([myClass respondsToSelector:@selector(test2)]){
    [myClass test2];
}

类目的使用

@interface Tool:NSObject

NSString *_name;

@property (nonatomic,strong)NSString *property1;

@end

//在类目中为原类添加新的方法和属性
/*
类目的使用场景
1.类包含了很多个方法实现,而这些方法需要不同团队成员来实现
2.当你在使用基础类库中的类时,你不想继承这些类而指向添加一些方法时

使用类目的时候需要注意的问题
1.类目可以访问原始类的实例变量,但不能添加实例变量,如果想添加变量,那就通过继承创建子类来实现。
2.类目可以重载原始类的方法,但不推荐这么做,这样会覆盖掉原始类的方法。如果确实要重载,那就通过继承创建子类来实现。
3.和普通接口有所区别的是,在类目的实现文件中的实例方法只要你不去调用它你可以不用实现所有声明的所有方法。
*/

@interface Tool(ToolCategory)
//{
// 类目中不能添加实例变量
//}
@property NSString *property2;

-(void)function1;

-(void)function2;


//Tool.m
@implementation Tool

-(void)function1{
NSLog(@”im function1”);
}

@end

@implementation Tool(ToolCategory)
/*
类目中不能添加实例变量!!!
NSString *_property2;
*/

/*
iOS运行时机制
iOS 运行时机制,简单来说,就是苹果为开发者提供的一套运行时动态创建类、方法、属性的API,它是一套纯C语言的API。
*/

-(void)function2{
NSLog(@”%@”,_name);
NSLog(@”function2”);
NSLog(@”%@”,self.property2);
}

-(void)setProperty2:(NSString *)property2{
// _property2 = property2;

/*
    id object:对哪个对象的属性赋值
    const void *key:属性对应的key
    id value:设置属性值为value
    objc_AssociationPolicy policy:使用的策略
*/

objc)setAssociatedObject(self,@selector(property2),property2,OBJC_ASSOCIATION_RETURN_NONATOMIC);
}

-(NSString *)property2{
// return _property2;

return objc_getAssociatedObject(self,@selector(property2));
}

//-(void)function1{
// NSLog(@”我是类目中的function1”);
//}

@end


延展:

延展
延展的作用就是定义自己的私有方法
延展的实现不用再创建一个@implementation

-(void)test1{
NSLog(@”text1”);
}

-(void)test2{
NSLog(@”text2”);
[self testExtension];
[self testExtension2];
}

-(void)testExtension{
NSLog(@”我是延展testExtension”);
}

-(void)testExtension2{
NSLog(@”我是延展testExtension”);
}


协议
/*
我们之前讲过非正式协议(NSObject的类目),那么肯定还有正式协议。
在OC中,一个类可以实现多个协议,通过协议可以弥补单继承的缺陷。但是协议跟继承不一样,
协议只是一个方法列表,方法的实现得靠遵循该协议的类去完成。
协议:协议是一套标准,这个标准里面声明类很多方法,但是不关心具体这些方法是怎么实现的,具体的实现是由遵循这个协议的
类去完成的。
*/

//协议 正式协议用protocol来定义
@protocol FoodProtocol< NSObjcet >

@required
-(void)sendFood:(BOOL)flag;

@optional
-(void)sayHello;

/*
在方法声明的时候,可以有两个关键字去限制是否让遵循该协议的类去实现方法
@required 标注的方法为必须实现的方法
@optional 标注的方法为可选实现的
*/

//声明类一个必须实现协议的对象,使用assign/weak,为了防止循环引用
@property (nonatomic,assign)id< FoodProtocol> delegate;

-(void)setFlag:(BOOL)flag{
// conformsToProtocol:确定了一个对象是否实现了某个协议
// 如果代理存在并且代理遵循了某个协议
_flag = flag;
if (self.delegate && [self.delegate conformsToProtocol:@protocol(FoodProtocol)]){
[self.delegate sendFood:_flag];
}
else{
NSLog(@”代理不存在”);
}
}

//实现协议里面的方法
@interface Waiter : NSObject < FoodProtocol>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值