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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© huh 中级黑马   /  2015-12-25 23:46  /  597 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

是什么?
    把一个类分成多个部分
有什么用?
    在不改变原有类的基础上,给原有类,添加功能(方法)!  有利于多人之间的协同开发!
    给系统提供的类,添加额外的功能!   
怎么用?
    Xcode里面的使用:
    选择: Object -C File什么时候用?
    场景1:在已写好类的基础上,想要不改变原有类的同时,添加新的方法?
    1)用继承!
    2)用分类Category
用的时候需要注意什么?
    在分类里面有本类相同名称的方法时候,需要注意,编译的顺序!后一次编译的会覆盖前面一次编译!
    更改编译的顺序方法
特殊:
一般
    分类中的方法和本类的方法相同,则最后一次的方法,将覆盖前面一次的方法!
特殊
    分类中的load方法,不会覆盖本类的load方法,分类中子类的load方法,同样不会覆盖父类和本类的load方法
  1. //
  2. //  Person.h
  3. //
  4. #import <Foundation/Foundation.h>
  5. @interface Person : NSObject
  6. {
  7.     NSString* _name;
  8. }
  9. @property NSString * name;
  10. -(id)initPerson:(NSString *)name;
  11. -(void)info;
  12. @end
  13. //
  14. //  Person.m
  15. //
  16. #import "Person.h"
  17. #import "Person.h"
  18. @implementation Person
  19. -(id) initPerson:(NSString *)name{
  20.     if (self = [super init]) {
  21.         _name = name;
  22.     }
  23.     return self;
  24. }
  25. -(void)info{
  26.     NSLog(@"Person的Info方法!");
  27. }
  28. @end
  29. //
  30. //  Student.h
  31. //
  32. #import "Person.h"
  33. @interface Student : Person
  34. -(void) studentInfo;
  35. @end
  36. //
  37. //  Student.m
  38. //
  39. //
  40. #import "Student.h"
  41. @implementation Student
  42. /*
  43. 场景1:在已写好类的基础上,想要不改变原有类的同时,添加新的方法?
  44.     第一种方案:继承父类,将需要添加的功能,写在子类里面!
  45. */
  46. -(void) studentInfo{
  47.     [super name];
  48.     NSLog(@"学生在学习...");
  49. }
  50. @end
  51. //
  52. //  Person+student.h
  53. //
  54. #import "Person.h"
  55. @interface Person (student)
  56. //分类里面不能写属性
  57. //@property int age;
  58. -(void) stuInfo;
  59. //Person分类,重写Person的Info方法
  60. -(void)info;
  61. @end
  62. //
  63. //  Person+student.m
  64. //
  65. #import "Person+student.h"
  66. @implementation Person (student)
  67. /*
  68. 场景1:在已写好类的基础上,想要不改变原有类的同时,添加新的方法?
  69. 第二种方案:使用分类
  70.     注意格式: 命名:原有类名+分类名
  71.              声明: @interface  原有类名(分类名)
  72.              实现: @implementation 原有类名(分类名)
  73. */
  74. -(void)stuInfo{
  75.    
  76.     NSLog(@"学习,学习...");
  77. }
  78. -(void)info{
  79.     NSLog(@"person的分类student的方法!");
  80. }
  81. @end
  82. //
  83. //  Person+sport.h
  84. //
  85. #import "Person.h"
  86. @interface Person (sport)
  87. -(void)info;
  88. @end
  89. //
  90. //  Person+sport.m
  91. //
  92. #import "Person+sport.h"
  93. @implementation Person (sport)
  94. -(void)info{
  95.     //调用本类的属性,但是属性修饰符>=@protected
  96.     NSLog(@"Person的分类sport的方法,身高:%@",_name);
  97. }
  98. @end
  99. /*
  100. NSString+getCount.h
  101. 场景2:给系统类NSString,添加方法
  102. 查看字符对象中,出现a的次数
  103. */
  104. #import <Foundation/Foundation.h>
  105. @interface NSString (getCount)
  106. //-(int)getCount:(NSString *)str;
  107. -(int)getcount;
  108. @end
  109. /*
  110. NSString+getCount.m
  111. 场景2:给系统类NSString,添加方法
  112. 查看字符对象中,出现a的次数?
  113.     1,取出字符对象的每个元素
  114.     2,进行比较
  115. */
  116. #import "NSString+getCount.h"
  117. @implementation NSString (getCount)
  118. /*
  119. -(int)getCount:(NSString *)str{
  120.     int count = 0;
  121.     for (int i = 0; i<str.length; i++) {
  122.         unichar uc = [str characterAtIndex:i];//取出每个元素
  123.         if(uc =='a'){
  124.             count ++;
  125.         }
  126.     }
  127.     return count;
  128. }
  129. */
  130. -(int)getcount{
  131.     int count = 0;
  132.     for (int i = 0 ;i<self.length; i++) {
  133.         unichar uc = [self characterAtIndex:i];
  134.         if(uc == 'a'){
  135.             count ++;
  136.         }
  137.     }
  138.     return count;
  139. }
  140. @end
  141. /*
  142. main.m
  143. 什么是分类Category?
  144. 把一个类分成多个部分
  145. 分类有什么好处?
  146. 1)在不改变类的情况下,给类添加方法
  147. 2)协同开发,优化类的结构
  148. 3)给系统提供的类,添加额外的功能
  149. 继承和分类的区别?
  150. 相同点:
  151.     分类和继承都可以在不改变类的同时,给类添加方法
  152. 不同点:
  153.     分类在调用时候,直接调用就可以!
  154.     继承在调用的时候,需要强制转换!
  155. 需要注意什么?
  156. 1)分类里面不能写属性
  157. 2)分类里面不能用super
  158. 3)分类里面的方法,最好不要跟主类或其他分类的方法相同,
  159.    否则最后编译的方法,将会覆盖前面的方法!
  160. 4)分类中可以直接使用主类的属性,但是属性必须是>=@protected
  161. 编译器编译的顺序:
  162.     父类--> 主类 --> 分类
  163. */
  164. #import <Foundation/Foundation.h>
  165. #import "Person.h"
  166. #import "Student.h"
  167. #import "Person+student.h"
  168. #import "NSString+getCount.h"
  169. int main(int argc, const char * argv[]) {
  170.     Person *per  = [[Person alloc]initPerson:@"huh"];
  171.     NSLog(@"name =%@",per.name);
  172.    
  173. // 场景1:在已写好类的基础上,想要不改变原有类的同时,添加新的方法?
  174. //    第一种,子类继承父类,将新添的方法写在子类里面(studentInfo)
  175.     Person *per1 = [Student new];
  176.     Student *stu = (Student *)per1;
  177.     [stu studentInfo];
  178.    
  179. //    第二种,采用分类方式,分类调用方法不需要强转,直接调用就可!
  180.     [per stuInfo];
  181.     [per1 stuInfo];
  182.    
  183.     /*分类里面不能写属性
  184.     stu.age =10;
  185.     NSLog(@"age = %d",stu.age);*/
  186.    
  187. /*  
  188.     两个输出的结果相同,都是分类的方法
  189.     因为,分类中跟本类方法名相同的方法,
  190.     后一次会覆盖上次的方法!
  191.     per1.name = @"huh";
  192.     per1.info;
  193.     stu.info;
  194. */
  195. //    场景2:给系统类NSString,添加方法
  196. //    查看字符对象中,出现a的次数
  197. //    第一种方式
  198. //    NSString * str = @"jdlsjaaqwioaaeda";
  199. //    NSLog(@"a出现的次数%d",[str getCount:str]);
  200. //    第二种方式(简洁)
  201.     NSString * str = @"jaadalasjaaqwioaeda";
  202.     NSLog(@"a出现的次数%d",str.getcount);
  203.     int count  = [str getcount];
  204.     NSLog(@"a出现的次数%d",count);
  205.     return 0;
  206. }
复制代码



file:///var/folders/7h/xb292dy96z57vt0fp8wpzvfm0000gn/T/WizNote/ed3f4cc2-c138-4c1e-ba8f-cd61e7723df0.png

file:///var/folders/7h/xb292dy96z57vt0fp8wpzvfm0000gn/T/WizNote/ed3f4cc2-c138-4c1e-ba8f-cd61e7723df0.png


1.png (23.41 KB, 下载次数: 0)

1.png

2.png (24.31 KB, 下载次数: 0)

2.png

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马