OC-协议

OC-协议

基础

  • 协议是一个类可以选择实现的一组定义的方法(类似java中的接口)
  • OC中协议分为:正式协议和非正式协议
  • 正式协议: 协议中的方法都要实现
  • 非正式协议: 可以选择实现
  • 声明协议
    • 协议的声明位于头文件中
    • 协议没有对应的实现文件
    • 在OC2.0之后允许把协议方法标记为可选或必须的
      • 采用协议的类必须实现协议的所有必须方法
      • @required是默认的

    @protocol DrawableItem

    @required
    -(void) drawItem;
    -(NSRect) boundingBox;
    -(void) setColor:(NSColor*)color;

    @optional
    -(NSString)labelText;
    @end


  • 采用协议

  • 一个类可以通过在@interface行中添加用尖括号括住的协议名称,来告诉编译器它采用哪个协议
  • 如果一个类采用协议或者他继承自摸个采用协议的类,那么这个类就必须遵守协议
  • 一个类可以采用多个协议:在单独一组尖括号中列出这些协议,并用逗号分隔他们
  • 协议的顺序是不重要的
@interface AcmeUniversalBolt: AcmeComponent<DrawableItem, NSCopying>


  • 协议作为类型

  • 声明一个变量时,可以通过向类型声明中添加协议名称,把变量声明为一种可以保存遵守协议的对象的类型
    id<DrawableItem> currentGraphic; //currentGraphic所指向的对象必须遵守DrawableItem协议


  • 属性和协议

  • 如果某些协议方法是访问器方法,就可以使用属性语句在协议头文件中声明他们
  • 采用这种协议的任何类都必须合成与属性对应的访问器,或者提供他们的实现, 就向在类的@interface部分声明属性一样
    @protocol DrawableItem
    -(void) drawItem;
    @property (nonatomic, retain) NSString* name;   
    @end
  • NSObject类和NSObject协议

    • 既有NSObject类,也有NSObject协议
    • NSObject是几乎所有的OC对象的根类
    • NSObject协议是一个正式协议,其中列出了任何类为成为良好的OC“公民”而必须实现的方法。
    • NSObject类采用NSObject协议,然后大多数类都将直接或者间接的从NSObject继承这些方法
    • Foundation的另一个根类是NSproxy(用于构建分布式系统), 也采用NSObject协议
  • 协议对象

    • 协议对象是代表协议的对象,他们是Protocol类的成员
    • 利用@protocol()指令从协议的名称中获得协议对象。
    • 与类对象不同,协议对象没有方法
    • 他们只能被用于为NSObject类的conformsToProtocol:方法的参数
    • 这个方法可以用于判断接收者是否实现了协议中所有必须的方法
    • 即,可以使用这个方法来判断一个对象(或者类)是否遵守协议、
    Protocol myDataSourceProtocol = @protocol(TablePrinterDataSource);

    //判断对象或者类是否遵守协议
    if( [newDataSource conformsToProtocol: @protocol(TablePrinterDataSource)] )
    {
        //TODO
    }

    or

    if([Person conformsToProtocol: @protocol(TablePrinterDataSource)])
    {
        //TODO
    }


  • 非正式协议

  • 说白了就是没有实现方法的类别
  • 如果一个类别只有头文件却没有实现,编译器是不会报错的
  • 但是应注意的是:
    • 在编码采用非正式协议的类时,协议的方法实现必须位于类的@implementation部分,而不是类别的@implementation部分
    • 如果把这些方法放在单独的类别@implmentation部分,则是将把所有方法实现添加到所有类中!!!!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值