黑马程序员技术交流社区

标题: 分类(category)和协议(protocal)总结 [打印本页]

作者: gzf201314    时间: 2015-1-26 18:35
标题: 分类(category)和协议(protocal)总结
  1. /*
  2. 分类(category)和协议(protocal)
  3. 分类以模块的方式向类添加方法 扩展现有类
  4. */
  5. #import <Foundation/Foundation.h>
  6. //声明
  7. @interface Fraction : NSObject
  8. -(void)test;
  9. @end//Fraction

  10. //定义分类的格式:类名称 (分类名称)
  11. //为Fraction定义新的分类,类名是MathOps
  12. @interface Fraction (MathOps)
  13. - (void)print;
  14. @end

  15. /*
  16.         有名称的分类:不可以通过定义附加的实例变量来扩展类,只能定义方法
  17.         没有名称的分类(类的扩展):
  18.         1.可以通过定义附加的实例变量来扩展类
  19.         2.未命名的分类中声明的方法需要在主实现区域实现,而不是在分离的实现区域实现
  20.         3.如果没有实现未命名分类的接口部分列出的全部方法,编译器会发出警告
  21. */

  22. //为Fraction定义一个没有名称的分类,(这种特殊的语法定义为类的扩展)
  23. @interface Fraction ()
  24. @property int name;//实例变量
  25. - (void)test2;
  26. @end

  27. //对象/分类名称对必须是唯一的。

  28. //实现
  29. @implementation Fraction
  30. @synthesize name;

  31. -(void)test
  32. {
  33.         NSLog(@"test Demo!");
  34. }
  35. - (void)test2
  36. {
  37.         NSLog(@"test2 Demo!");
  38. }
  39. -(void)print
  40. {
  41.         NSLog(@"print Demo!");
  42. }
  43. @end//implementation Fraction

  44. //声明协议代理
  45. /*
  46.         协议也是两个类之间的接口定义
  47.         定义了协议的类可以看做是将协议定义的方法代理给了实现他们的类
  48.         类的定义可以更为通用
  49.         具体的动作由代理类来承担
  50. */
  51. @protocol Drawing
  52. - (void)test;
  53. @optional
  54. - (void)outline;
  55. @end

  56. id currentObject;
  57. //conformsToProtocal: 用这个方法检查一个对象是否遵循某项协议
  58. if([currentObject conformsToProtocol:@protocol(Drawing)]==YES)
  59. {
  60.         //执行代码
  61. }

  62. //检查是否实现了可选的方法
  63. if([currentObject respondsToSelector:@selector(outline)]==YES)
  64. {
  65.         //执行代码
  66. }

  67. /*
  68.         分类(小括号中有名称的是分类没有名称的是类的扩展)与协议
  69.         1.分类suffx遵循协议不影响Fraction的父类
  70. */
  71. @interface Fraction (suffx)<Drawing,NSCopying,NSCoding>
  72. @end

  73. /*
  74.         类的扩展与协议
  75. */
  76. @interface Fraction ()<Drawing>
  77. @end

  78. /*
  79.         非正式(informal)协议也成为抽象(abstract)协议
  80. */

  81. /*
  82.         块是对c语言的一种扩展
  83.         格式:
  84.         块的返回类型 (^块名称) (参数列表所对应的参数类型)=^(参数类型 参数名,......){
  85.                 块代码执行区域
  86.         }
  87.         块的调用跟C语言中的函数调用一样
  88. */
  89. int main()
  90. {
  91.         int (^myBlock) (int)=^(int num){
  92.                 return num * num;
  93.         };
  94.         int result=myBlock(20);
  95.         NSLog(@"反回的值是:%d",result);
  96. }
复制代码



作者: laichunhui    时间: 2015-1-26 20:12
顶个,,,,,,,,,,,,
作者: MacxChina    时间: 2015-1-27 01:24
加油!!少年!!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2