iOS类目延展和协议
Posted 奉灬孝
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS类目延展和协议相关的知识,希望对你有一定的参考价值。
类目:为已知的类增加新的方法;注意:类目里面只能写方法,不能写声明和属性,所以,类目不能作为接口来用
1、类目无法向已有类中添加实例变量。
2、如果类目中的方法和已有类中的方法名称冲突时,类目中的方法优先级高,如果方法名冲突,已有类中的原始方法便无法使用。
3、在使用类目的时候,最好是将自己扩展的方法和原始方法区分开来。
1、类目方法的应用:
1)对现有类进行扩展:如:可以扩展Cocoatouch框架中的类,在类目中增加的方法会被子类继承,而且在运行时跟其他的方法没有区别。
2)作为子类的替代手段:不需要定义和使用一个子类,可以通过类目直接向已有的类里增加方法。
3)对类中的方法归类:利用catigory把一个庞大的类划分为小块来分别进行开发,从而更好地对类中的方法进行更新和维护。
2、类目方法的局限性:
1)无法向类目中添加
新的实例变量,类目没有位置来容纳实例变量。如果想增加类的实例变量,只能通过定义子类的方式。
2)如若,在类目中覆盖先后类的方法。这样会引起super消息的断裂,因为类目总的方法具有更高的优先级,因此,一般不要覆盖现有类中的方法。
3、类目的定义:
类目的命名规则:类名+扩展方法,如“NSString+Revert”。类目的接口声明与类的定义十分相似,但类目不继承父类,只需要带有一个括号,表明该类目的主要用途。
4、举例说明:
NSString+Revert.h文件:
NSString+Revert.m文件:
延展:通知在本类的定义里使用类目来声明私有方法;
(1).延展的作用就是定义自己的私有方法。
(2).在自己类的实现文件中添加类目(匿名类目)来声明私有方法。(只有本类的.m文件中才能使用)。
(3).形式和类目相同,不用新创建文件,只是把类目的interface地方的文件放在了你需要扩展的类的.m文件里边。
类的延展可看成是一种匿名的类目,类有时需要一些只有自己看得见的,所用的私有方法可以通过延展的方式来声明,延展中定义的方法在类本身的@implementation代码区域中进行实现。
当在定义延展的时候不提供类目名时,延展中定义的方法既被视为“必须实现”的API在这种情况下,如果方法没有实现代码,那么编译器会报警告,这个时候方法的实现就一定要出现在类主体的@implementation代码块中了。
协议
(1).协议声明了可以被其他的类实现的方法。协议本身必不会去实现。
(2).协议不是类,只是一个其他对象可以实现的接口。
注意:
@required 必须方法 (默认)
@optional 可选方法
Girl.h文件中
#import <Foundation/Foundation.h>
#warning ?????????? 1.声明协议 ??????????
@protocol MarriageDelegate <NSObject>
@required //必须方法(默认)
- (void)makeMoney;
- (void)satisfyHer;
@optional //可选方法
- (void)cooking;
@end
@interface Girl : NSObject
#warning ?????????? 2.设置代理人属性 ??????????
@property (nonatomic, assign) id<Marriage> delegate;
- (void)buybuybuy;
@end
Girl.m文件中
#import "Girl.h"
@implementation Girl
- (void)buybuybuy{
#warning ?????????? 3.代理人执行方法 ??????????
[self.delegate makeMoney];
}
@end
Boy.h文件中
#import <Foundation/Foundation.h>
#import "Girl.h"
#warning ?????????? 4.签订协议 (当前类中要实现必须方法) ??????????
@interface Boy : NSObject <MarriageDelegate>
@end
Boy.m文件中
#import "Boy.h"
@implementation Boy
#warning ?????????? 6.实现协议中声明的必须方法 ??????????
- (void)makeMoney{
NSLog(@"赚钱");
}
- (void)satisfyHer{
NSLog(@"亲吻");
}
@end
协议演示
//////////协议演示//////////
#import <Foundation/Foundation.h>
#import "Girl.h"
#import "Boy.h"
int main(int argc, const char * argv[]) {
//////////使用代理//////////
Girl *girl = [[Girl alloc] init];
Boy *boy = [[Boy alloc] init];
#warning ?????????? 5.指定代理人 ??????????
girl.delegate = boy;
[girl buybuybuy];
//输出: 赚钱
//判断是否对象是否遵循某些协议
BOOL result = [girl conformsToProtocol:@protocol(Marriage)];
if (result) {
NSLog(@"遵循Marriage协议");
}else{
NSLog(@"不遵循Marriage协议");
}
//输出: 不遵循Marriage协议
return 0;
}
本文整理了简书Luisx的文章和51CTO蓝鸥张浩的博客,然后自己整理的,希望大家对类目、延展和协议有个新的认识。
以上是关于iOS类目延展和协议的主要内容,如果未能解决你的问题,请参考以下文章