A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

适合有java和C基础的同学迅速了解OC

  1.        
  2. #import <Foundation/Foundation.h>

  3. // ProtocolA comply with root protocol
  4. @protocol ProtocolA <NSObject>
  5. // 返回值为遵守了ProtocolA的对象
  6. - (NSObject<ProtocolA> *)getSelf;
  7. @end

  8. // ProtocolB comply with ProtocolA
  9. @protocol ProtocolB <ProtocolA>

  10. @required  // 以下方法需要实现
  11. + (id)getSelfClass;
  12. - (Class)getSelfClass;
  13. @end

  14. @protocol ProtocolC <NSObject>

  15. @optional  // 以下方法选择性实现
  16. - (void)methodC;
  17. @end

  18. // ClassA comply with ProtocolB and ProtocolC
  19. @interface ClassA :NSObject <ProtocolB,ProtocolC>

  20. // _obj成员限定指向实现了ProtocolB的对象
  21. @property(nonatomic,strong) NSObject<ProtocolB> *obj;
  22. @end

  23. @implementation ClassA
  24. +(id)getSelfClass
  25. {
  26.         return self;
  27. }

  28. - (NSObject<ProtocolA> *)getSelf
  29. {
  30.         return self;
  31. }

  32. - (Class)getSelfClass
  33. {
  34.         return [self class];
  35. }

  36. @end

  37. int main()
  38. {
  39.         ClassA<ProtocolB> *a=[[ClassA alloc] init];
  40.         // a2限定指向实现了 ProtocolA 的对象
  41.         id<ProtocolA> a2=[[ClassA alloc] init];
  42.         [a setObj:a2];
  43.        
  44.        
  45.         NSLog(@"a=%@,aClass=%@,a2Class=%@",
  46.         [a getSelf],[a getSelfClass],[[a2 class] getSelfClass]);
  47.        
  48.         return 0;       
  49. }
复制代码




protocol:
        概念:
                用来声明方法(也只能声明方法),遵守了该协议的 类或其他协议 就拥有这些方法的声明;
                类似java中的interface,但是由于OC是弱类型语言(java为强类型),
                许多类型上的不匹配都只是warning;
        protocol与 (java中)interface 区别:
        1>interface类型变量只能指向 实现了该interface的对象,
                        而protocol本身不是类型,无法用于声明变量;
                        这种多态的特征在OC中则表现为 指定了protocol 的变量
                        限定指向 遵守了该protocol的对象(OC中此类规则违反仅仅警告),
                        例:id<ProtocolA> p=[[ClassA alloc] init];(ClassA遵守了ProtocolA)
        2>遵守了protocol却没实现当中方法只是警告,interface中是编译错误

声明protocol:
        //NSObject为基协议,与基类NSObject同名,但不同,
        //基类 NSObject 遵守了 基协议 NSObject
        //与类都继承基类一样,官方建议 协议都遵守基协议
        @protocol ProtocolA <NSObject>
        //协议中声明的方法可以规定为须实现或可选,默认为 required
        @required   // 此后声明的方法都为required,遵守该协议的类中不实现就会警告
        - (id<ProtocolA>)methodA:NSObject<ProtocolA> *obj;
        - (void)methodB;
       
        @optional  // 此后声明的方法都为optional,遵守该协议的类中不实现不会警告
        - (id)methodC:ClassA<ProtocolB> obj;
        - (void)methodD;       
        @end
       
类遵守protocol:
        // OC类是单继承,但可以遵守多个协议
        @interface ClassA :NSObject <ProtocolA,ProtocolB>
        @end
       
        @implementation ClassA
        //这里实现协议中的方法
        @end

使用规范:
        为了提高编译效率,.h一般不import协议,用@protocol ProtocolA,ProtocolB; 这种
        方式来告诉编译器ProtocolA与ProtocolB是协议,而在.m中再import,
        与@class ClassA,ClassB; 方式一样;
       


1 个回复

倒序浏览
其实有java基础的同学看一下跟java接口类似,基本就会用了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马