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蓝鸥张浩的博客,然后自己整理的,希望大家对类目、延展和协议有个新的认识。

  • 相关阅读:
    TextBox 只有下划线
    can't find web control library(web控件库)
    DropDownListSalesAC”有一个无效 SelectedValue,因为它不在项目列表中。
    IDE、SATA、SCSI、SAS、FC、SSD 硬盘类型
    如何打印1px表格
    CSS控制打印 分页
    Virtual Server could not open its emulated Ethernet switch driver. To fix this problem, reenable the Virtual Server Emulated Et
    Xml中SelectSingleNode方法中的xpath用法
    热带水果莫入冰箱?水果存放冰箱大法
    探索Asp.net的Postback机制
  • 原文地址:https://www.cnblogs.com/ansyxpf/p/5628708.html
Copyright © 2011-2022 走看看