zoukankan      html  css  js  c++  java
  • iOS类目、延展和协议

    类目:为已知的类增加新的方法;注意:类目里面只能写方法,不能写声明和属性,所以,类目不能作为接口来用

    1、类目无法向已有类中添加实例变量。
    2、如果类目中的方法和已有类中的方法名称冲突时,类目中的方法优先级高,如果方法名冲突,已有类中的原始方法便无法使用。
    3、在使用类目的时候,最好是将自己扩展的方法和原始方法区分开来。

    1、类目方法的应用:

    1)对现有类进行扩展:如:可以扩展Cocoatouch框架中的类,在类目中增加的方法会被子类继承,而且在运行时跟其他的方法没有区别。

    2)作为子类的替代手段:不需要定义和使用一个子类,可以通过类目直接向已有的类里增加方法。

    3)对类中的方法归类:利用catigory把一个庞大的类划分为小块来分别进行开发,从而更好地对类中的方法进行更新和维护。

    2、类目方法的局限性:

    1)无法向类目中添加

    新的实例变量,类目没有位置来容纳实例变量。如果想增加类的实例变量,只能通过定义子类的方式。

    2)如若,在类目中覆盖先后类的方法。这样会引起super消息的断裂,因为类目总的方法具有更高的优先级,因此,一般不要覆盖现有类中的方法。

    3、类目的定义:

    类目的命名规则:类名+扩展方法,如“NSString+Revert”。类目的接口声明与类的定义十分相似,但类目不继承父类,只需要带有一个括号,表明该类目的主要用途。

    4、举例说明:

    NSString+Revert.h文件:

    151437959.jpg

    NSString+Revert.m文件:

    151504261.jpg

    延展:通知在本类的定义里使用类目来声明私有方法;

    (1).延展的作用就是定义自己的私有方法。
    (2).在自己类的实现文件中添加类目(匿名类目)来声明私有方法。(只有本类的.m文件中才能使用)。
    (3).形式和类目相同,不用新创建文件,只是把类目的interface地方的文件放在了你需要扩展的类的.m文件里边。

    类的延展可看成是一种匿名的类目,类有时需要一些只有自己看得见的,所用的私有方法可以通过延展的方式来声明,延展中定义的方法在类本身的@implementation代码区域中进行实现。

    151558130.jpg

    当在定义延展的时候不提供类目名时,延展中定义的方法既被视为“必须实现”的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蓝鸥张浩的博客,然后自己整理的,希望大家对类目、延展和协议有个新的认识。

  • 相关阅读:
    HDU 4034 Graph:反向floyd
    POJ 2728 Desert King:最优比率生成树
    求树的最大独立集,最小点覆盖,最小支配集 贪心and树形dp
    AtCoder ARC061E Snuke's Subway Trip 最短路
    hdu4126_hdu4756_求最小生成树的最佳替换边_Kruskal and Prim
    洛谷 P2633 Count on a tree
    POJ3241 最小曼哈顿距离生成树
    HDU6315 Naive Operations 线段树
    ACM-ICPC 2018 沈阳赛区网络预赛-B,F,G
    LCA
  • 原文地址:https://www.cnblogs.com/ansyxpf/p/5628708.html
Copyright © 2011-2022 走看看