OC-类目延展协议
来源:互联网 发布:软件团队建设管理方案 编辑:程序博客网 时间:2024/06/05 02:43
目录:
- 1.类目
- 2.延展
- 3.协议
一、类目
什么是类目?
类目(也称类别:Category)是一种为现有类添加新方法的方式。
类目和一个类的实现非常相似,只是语法稍有不同:
类目的语法:
类目的特点:
- 若类目中重写了类现有的方法,则优先调用类目方法
- 类目无法添加成员变量,而可以添加属性
- 类目中添加属性需要使用@dynamic动态合成,手动实现setter和getter方法,并且改类已经存在对应的成员变量
为什么我们要使用类目?
某些情况下,我们需要对一些现有的类添加一些方法
通常做法是继承要添加方法的类,然后在子类中扩展出新的方法
Objective-C的动态语言机制,可以为现有的类添加新的方法
类目实例
现在我们要对NSString增加新的方法用于比较两个字符串的大小,告诉用户谁大。
第一步:创建类目
第二步:在.h中创建一个方法,该方法就是类目给NSString增加的方法,用于比较两字字符串大小
NSString + Compare.h
- (NSComparisonResult)compareValue:(NSString *)string;
NSString + Compare.m
#import "NSString+Compare.h"@implementation NSString (Compare)- (NSComparisonResult)compareValue:(NSString *)string{ if (self.length == 0 && string.length == 0) { NSLog(@"不合法"); return -3; } NSInteger a = [self integerValue]; NSInteger b = [string integerValue]; if (a > b) { NSLog(@"first > second"); return -1; }else if (a < b){ NSLog(@"first < second"); return 1; } NSLog(@"first = second"); return 0;}
main.m
NString *string = @"123"; NSString *string2 = @"234"; NSInteger value = [string compareValue:string2]; NSLog(@"%ld",value);
上面说过类目可以添加属性,我们来看看实例
我们创建一个person类,给这个类添加类目
Person+AgeDifference.h
#import "Person.h"@interface Person (AgeDifference)//为person添加身份证号code属性//类目中属性仅仅完成了声明部分@property (nonatomic, retain) NSString *code;- (NSInteger)ageDifferenceWithPerson:(Person *)person;@end
Person+AgeDifference.m
#import "Person+AgeDifference.h"@implementation Person (AgeDifference)//@dynamic 属性动态合成:需要手动实现setter和getter方法,并且与属性声明部分一致@dynamic code;- (void)setCode:(NSString *)code{ if (_code != code) { [_code release]; _code = [code retain]; }}- (NSString *)code{ return _code;}- (NSInteger)ageDifferenceWithPerson:(Person *)person{ if (!person) { return 0; } return labs(self.age - person.age);}@end
main.m
Person *person = [[Person alloc] init]; Person *person1 = [[Person alloc] init]; person1.code = @"2345678"; NSInteger age = [person ageDifferenceWithPerson:person1]; NSLog(@"age difference is %ld",age); NSLog(@"ffff:%@",person1.code);
二、延展
类的私有方法
Objective-C中没有绝对意义上的私有方法 在.h文件中声明的方法都属于公开的方法,意味着开放给别人调用
如果不想公开某些方法,可以不在.h文件中声明 这样的方法可以被本类中的其他方法所调用
如果在类外面强行调用这些未公开的方法,也能调用,但是会有编译器警告
延展的概念
延展是匿名类目,为当前类添加私有方法: 使用类目增加的方法是让外部可见,而延展的目的是增加方法,让外部不可见;
不可见的目的更多的是封装代码,对于想要隐藏的算法和接口,可以使用延展;
注意:
//延展为类声明私有方法,外部不可见,只有本类可以使用
//延展可以声明方法,成员变量,属性
@interface Person ()@end这种方式使用延展,@implementation部分可直接添加到Person类的实现中;注意如果是给其他文件中的类延展则不能省略这些。
延展的实例
在刚刚创建的Person类的.m文件直接写延展
Person.m
#import "Person.h"//延展@interface Person ()//为类声明私有方法,外部不可见,只有本类可以使用//可以声明方法,成员变量,属性- (NSInteger)changeNumber:(NSNumber *)stringValue;@end@implementation Person- (instancetype)initWithName:(NSString *)name age:(NSInteger)age{ self = [super init]; if (self) { _name = name; _age = age; NSInteger a = [self changeNumber:@"-1"]; NSLog(@"gggg:%ld",a); } return self;}- (NSInteger)changeNumber:(NSNumber *)stringValue{ return labs([stringValue integerValue]);}@end
可以发现在延展里面的方法,只能在本类中调用,不可以在其他地方调用
三、协议,委托模式
协议
协议是一个命名的方法列表,是对象之间的交互原则与共识,一个类使用协议称作该类遵守了协议;
协议中的所有内容,只是作为一个声明,由遵守该协议的类的实现部分去实现协议方法(和我们生活中一样,如果没有人履行它,协议就是无用的纸而已);
协议可以声明属性和方法,协议的目的是告诉外部我一定会有,所以它无法用来声明全局变量,而实际上,你声明的属性和方法具体是否存在,得看你是否正确的履行了协议中的所有内容
协议声明的属性和方法可以选择是否必须,关键字分别为@required必须和@optional可选,默认为必须;
苹果同样提供了专门的协议文件模版,它只有一个.h文件。
委托模式
Delegate本身是一种设计模式。
原理:自己不做的事,找一个委托人(delegate)来帮你做
注意:协议protocol 和委托delegate 是两个完全不同的概念 放在一起说 是因为我们总是在同一个头文件里看到它们;
实例:顾客委托商家买一个iphone6
我们创建商家和顾客两个类,分别为Customer和Business
创建代理委托,我们分为三步骤
第一步:协议
第二步:代理属性
第二步:设置代理人
Customer.h
#import <Foundation/Foundation.h>//协议:通常是方法列表,有两个关键字@required(方法必须实现),@optional(方法可以实现也可不实现),如果两个关键字都不加,默认required@protocol MyDelegate <NSObject>-(void)buyIphone:(NSString*)iphoneType; //代理传值方法@end@interface Customer : NSObject//delegate属性:一般需使用弱引用(assign或weak)@property (nonatomic, assign)id <MyDelegate> delegate;- (void)willBuy;@end
Customer.m
#import "Customer.h"@implementation Customer- (void)willBuy{ if (_delegate && [_delegate respondsToSelector:@selector(buyIphone:)]) {//如果协议响应了buyIphone:方法 [self.delegate buyIphone:@"iphone6"];//通知执行协议方法 }else{ NSLog(@"_delegate不存在"); return; }}@end
Business.h
#import <Foundation/Foundation.h>#import "Customer.h"@interface Business : NSObject<MyDelegate>//要成为代理人必须遵守协议,并且实现协议的方法@end
Business.m
#import "Business.h"@implementation Business//实现协议的方法-(void)buyIphone:(NSString*)iphoneType{ NSLog(@"有你需要的%@",iphoneType);}@end
main.m
//委托协议 Customer *custom = [[Customer alloc] init]; Business *business = [[Business alloc] init]; custom.delegate = business;//设置代理人 [custom willBuy];
- OC-类目延展协议
- OC中类目,延展,协议
- OC 08 类目延展协议
- OC 类目category,延展extension,协议protocol
- OC学习总结之延展类目协议
- OC教程3-类目延展协议
- OC学习:协议、类目和延展
- OC学习 第十章 类目延展协议
- OC初期-07NSDate,类目,延展,协议
- OC学习心得之延展类目协议
- OC语言 非正式协议---类目&延展
- 类目,延展,协议
- iOS 类目,延展,协议
- 延展类目协议
- 类目,延展,协议
- 类目 延展 和 协议
- 类目、延展、协议
- 类目,延展,协议
- android.widget.LinearLayout$LayoutParams cannot be cast to android.widget.AbsListView$LayoutParams
- Axure教程 axure新手入门基础(1)
- 勤奋是懒惰的元凶
- C语言函数调用模型[调用过程中在堆栈中的出栈、进栈顺序]
- spring mvc controller 获取不到@Value处理方法
- OC-类目延展协议
- Qt环境配置相关问题
- java 项目导入外部 jar包
- replace函数
- VS工程中添加c/c++工程中外部头文件及库的基本步骤
- CentOS-6.3安装配置SVN
- Android FTP ftpClient.listFiles()报java.lang.ClassNotFoundException: Didn't find class "Windows_NT"
- FFMPEG学习1利用FFMPEG和SDL简单实现播放器
- Matlab绘图颜色控制