zoukankan      html  css  js  c++  java
  • ObjectiveC中的Protocols

    在Objective-C语言中,@protocols与@interface类似,protocol常翻译为协议(在本文中也这么翻译,其实有点儿类似于java语言的interface,但也不同,在文末有类比)

     1 @protocol Foo <Other, NSObject> //实现者必须继承Other和NSObject
    2 - (void) doSomething;//实现者必须继承这个方法(方法默认情况下是@required作用范围)
    3 @optional
    4 - (int)getSomething;//实现者不是必须继承这个方法,因为该方法是在@optional作用范围内
    5 - (void)doSomethingOptionalWithArgument:(NSString *)argument;
    6 @required
    7 - (NSArray *)getManySomethings:(int)howMany;//实现者必须继承这个方法(方法在@required作用范围)
    8 @propery (nonatmoic, strong) NSString *fooProp;//注意:这里必须指定strong,除非这个属性是只读的
    9
    10 @end

    NSObject协议包含了NSObject的绝大多数方法。因为实现协议的方法后的class是NSObject对象,所以protocol需要作为NSObject协议的一个子协议语法的方式继承NSObject的大部分方法。

    protocls定义在头(header file——.h)文件中,可以单独一个.h文件中,或者定义在某个需要继承该协议的类的.h文件中。

    例如:

    UIScrollViewDelegate协议定义在UIScrollView.h文件中(可以自己在xcode中去查看或者看帮助文档)

    使用protocol,在类定义时继承该协议,例如:

    #import "Foo.h" //需要导入协议定义的头文件

    @interface MyClass:NSObject<Foo>//MyClass继承了Foo协议
    ...
    @end
    • 必须继承protocol中定义的非@optional方法,否则编译器会报错,编译不通过
    • 可以声明一个带有protocol的id变量,例如:id<Foo> obj = [[MyClass alloc] init];//MyClass必须是继承了Foo协议
    • 也可以声明带有协议参数的方法或者属性,例如
    -(void)giveMeFooObject:(id<Foo>)anObjectImplementingFoo;
    @property (nonatmoic, weak) id<Foo> myFooProperty;

    与java语言中的interface类比:

    相同:protocol和interface定义的方法,只是声明,没有实现;

    不同:interface(java)声明的方法都是必须继承实现的,属性必须初始化;protocol声明的方法默认是必须继承实现,但也可以声明为@optional(可选)可以不继承实现,属性也只是声明而已;

  • 相关阅读:
    DRF 配置
    RESTful 设计方法(学习总结用)
    Chrome 开发者工具
    html中注释的php代码被解析
    正则
    局域网域名访问php项目
    jQuery 操作from表单数据序列化
    jQuery操作Table tr td方法
    鼠标焦点在input的某个位置上,点击一个button 在input光标处的增加文字
    858. Mirror Reflection
  • 原文地址:https://www.cnblogs.com/linxyz/p/2411473.html
Copyright © 2011-2022 走看看