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类目延展和协议的主要内容,如果未能解决你的问题,请参考以下文章

OC 中 类目延展和协议

OC-类目延展协议

类目,延展,协议的基本概念

Objective-C中的类目,延展,协议

Objective-C中的类目(Category),延展(Extension)

9.类的延展