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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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

是什么?
    类的本质还是对象,叫类对象.用Class表示
    类的底层:typedef struct obj_class*Class(结构体)
有什么用?
    场景:想让程序一起的就给某值赋值!(load)
    场景:创建对象的时候,给某属性赋值,且只是赋值一次(initialize)
    场景:创建对象的时候,给属性赋值,且每次创建都进行赋值(init)
怎么用?
    获取类(类对象)的方法:
        Class  c = [类名 class];
        Class  c = [对象名 class];
    类对象加载会调用load方法
    对象加载会initialize
    +(void)initialize{}
    +(void)load{}
    -(id)init{}
用的时候需要注意什么?

1) 类对象创建的时候不用加*,    Class c = an.clas
对象创建的时候要加*,Animal * an =[[Animal alloc]init
2)一个类(类对象)可以有多个对象(对象的地址和值都不同),但是类(类对象的地址不同,值相同)只有一个!
分析:
类在创建类的对象时,每次创建,它就会开辟一个新的空间,里面会有isa指针,每一个isa指针都指向同个类对象,(所以,对象可以有多个,但类对象只有一个)


3)对象是在创建对象的时候加载,类(类对象)是在程序启动的时候就加载!

4)一个类的对象被创建,则其父类的对象也会被创建,父类的父类也会被创建...
5)分类中创建本类相同名称的方法,会覆盖本类的方法!load方法特殊!

  1. //
  2. //  Animal.h
  3. //
  4. #import <Foundation/Foundation.h>
  5. @interface Animal : NSObject
  6. @end
  7. //
  8. //  Animal.m
  9. //
  10. #import "Animal.h"
  11. @implementation Animal
  12. /*
  13. 当类对象加载,会调用load方法
  14. 验证,写个空的main方法,运行时会打印出
  15. 下面这句话...
  16. */
  17. +(void)load{
  18.     NSLog(@"Animal类对象加载的方法load...");
  19. }
  20. /*
  21. 对象创建时,会调用的方法initialize
  22. 不管有创建了多少对象,只会加载时调用一次,并且是在load方法之后调用!
  23. 验证:
  24.     main中创建多个对象,只会打印一次语句
  25. */
  26. +(void)initialize{
  27.     NSLog(@"Animal对象加载的方法initialize...");
  28. }
  29. /*
  30. 对象每次创建的时候,就会调用一次init方法
  31. 验证:
  32.     main中创建对象,创建几次,就会打印几次
  33. */
  34. - (instancetype)init
  35. {
  36.     self = [super init];
  37.     if (self) {
  38.         NSLog(@"Animal对象加载的方法init...");
  39.     }
  40.     return self;
  41. }
  42. @end
  43. //
  44. //  Cat.h
  45. //
  46. #import "Animal.h"
  47. @interface Cat : Animal
  48. @end
  49. //
  50. //  Cat.m
  51. //
  52. //
  53. #import "Cat.h"
  54. @implementation Cat
  55. +(void)load{
  56.     NSLog(@"Cat类加载的方法load...");
  57. }
  58. + (void)initialize
  59. {
  60.     NSLog(@"Cat类的对象加载方法initialize...");
  61. }
  62. -(id)init{
  63.     self = [super init];
  64.     if (self) {
  65.         NSLog(@"Cat的对象加载方法init...");
  66.     }
  67.     return self;
  68. }
  69. @end
  70. //
  71. //  BsCat.h
  72. //
  73. #import "Cat.h"
  74. @interface BsCat : Cat
  75. @end
  76. //
  77. //  BsCat.m
  78. //
  79. #import "BsCat.h"
  80. @implementation BsCat
  81. +(void)load{
  82.     NSLog(@"BsCat类加载的方法load...");
  83. }
  84. + (void)initialize
  85. {
  86.     NSLog(@"BsCat类的对象加载方法initialize...");
  87. }
  88. -(id)init{
  89.     self = [super init];
  90.     if (self) {
  91.         NSLog(@"BsCat的对象加载方法init...");
  92.     }
  93.     return self;
  94. }
  95. @end
  96. //
  97. //  Animal+sport.h
  98. //
  99. #import "Animal.h"
  100. @interface Animal (sport)
  101. @end
  102. //
  103. //  Animal+sport.m
  104. //
  105. /*
  106. 一般
  107.     分类中的方法和本类的方法相同,则最后一次的方法,将覆盖前面一次的方法!
  108. 特殊
  109.     分类中的load方法,不会覆盖本类的load方法
  110.     分类中子类的load方法,同样不会覆盖父类和本类的load方法
  111. */
  112. #import "Animal+sport.h"
  113. @implementation Animal (sport)
  114. +(void)load{
  115.     NSLog(@"Animal (sport)类加载的方法load...");
  116. }
  117. + (void)initialize
  118. {
  119.     NSLog(@"Animal (sport)类的对象加载方法initialize...");
  120. }
  121. -(id)init{
  122.     self = [super init];
  123.     if (self) {
  124.         NSLog(@"Animal (sport)的对象加载方法init...");
  125.     }
  126.     return self;
  127. }
  128. @end
  129. //
  130. //  Cat+eat.h
  131. //
  132. #import "Cat.h"
  133. @interface Cat (eat)
  134. @end
  135. //
  136. //  Cat+eat.m
  137. //
  138. #import "Cat+eat.h"
  139. @implementation Cat (eat)
  140. +(void)load{
  141.     NSLog(@"Cat (eat)类加载的方法load...");
  142. }
  143. + (void)initialize
  144. {
  145.     NSLog(@"Cat (eat)类的对象加载方法initialize...");
  146. }
  147. -(id)init{
  148.     self = [super init];
  149.     if (self) {
  150.         NSLog(@"Cat (eat)类的对象加载方法init...");
  151.     }
  152.     return self;
  153. }
  154. @end
  155. /*
  156. main.m
  157. 类本质上还是一个对象.叫类对象.这个对象的类型:Class
  158. 类对象是在程序启动的时候加载的,与对象创建无关.
  159. 类对象加载的标志:是load方法.

  160. 对象是在它被创建的时候加载的.且必须在类对象加载完成后才会加载.
  161. 对象加载会执行initialize方法. 只会在对象第一次创建的时候执行.

  162. 类,类对象,对象
  163. //Animal 是类对象! an是Animal的对象!c是类!
  164. Animal * an =[[Animal alloc]init];
  165. Class c = an.class;

  166. 方法:load/initialize/init
  167. load 是类(类对象)的加载方法
  168. initialize 是对象的加载方法(对象创建的时候执行,只执行一次)
  169. init  是构造方法(对象创建的时候执行,每次都执行)
  170. 注意:
  171.     1)对象在创建时,只会在第一次创建的时候加载一次,后面就不会加载了!
  172.     2)一个类(类对象)可以有多个对象,但是类(类对象)只有一个!
  173.     3)类对象在创建的时候不用加*,对象在创建的时候要加*.
  174.     4)一个类的对象被创建的时候,它父类的对象也会被创建,它父类的父类的对象也会被创建(间接父类也会被创建)
  175. 特殊:
  176.     一般
  177.     分类中的方法和本类的方法相同,则最后一次的方法,将覆盖前面一次的方法!
  178.     特殊
  179.     分类中的load方法,不会覆盖本类的load方法
  180.     分类中子类的load方法,同样不会覆盖父类和本类的load方法

  181. */
  182. #import <Foundation/Foundation.h>
  183. #import "Animal.h"
  184. #import "Cat.h"
  185. #import "BsCat.h"
  186. int main(int argc, const char * argv[]) {
  187.     //
  188.     //    //Animal 是类对象!   an是Animal的对象!
  189.     //    //类对象在创建的时候不用加*,对象在创建的时候要加*.
  190.     //    Animal * an =[[Animal alloc]init];
  191.     //    Class c = an.class; //c是类
  192.     //
  193.     //    //对象可以有多个,且每个都是独立得(地址和值都不同)
  194.     //    Animal * an1 =[[Animal alloc]init];
  195.     //    Animal * an2 =[[Animal alloc]init];
  196.     //    Animal * an3 =[[Animal alloc]init];
  197.     //    //对象的每个地址和值,都不同!
  198.     //    NSLog(@"an1的地址=%p,an2的地址=%p,an3的地址=%p",&an1,&an2,&an3);
  199.     //    NSLog(@"an1的值=%p,an2的值=%p,an3的值=%p",an1,an2,an3);
  200.     //
  201.     //
  202.     //   //&c1 是指针c的地址!   c1是指针存放的值!
  203.     //    Class c1 = [an class];
  204.     //    NSLog(@"c1的地址=%p,c1的值=%p",&c1,c1);
  205.     //
  206.     //    //类对象只能有一个(类的值相同)
  207.     //    Class c2 = [an2 class];
  208.     //    Class c3 = [an3 class];
  209.     //    Class c4 = [Animal class];
  210.     //    //类的地址不同K
  211.     //    NSLog(@"c的地址=%p,c2的地址=%p,c3的地址=%p,c4的地址=%p",&c,&c2,&c3,&c4);
  212.     //    //类的值相同
  213.     //    NSLog(@"c的值=%p,c2的值=%p,c3的值=%p,c4的值=%p",c,c2,c3,c4);
  214.     //
  215.     //创建多个对象,但是加载方法(initialize)只调用一次,(init)方法每次都执行
  216.     //    Animal *am = [[Animal alloc]init];
  217.     //    Animal *am2 = [[Animal alloc]init];
  218.     //    Animal *am3 = [[Animal alloc]init];
  219.     //    Animal *am4 = [[Animal alloc]init];
  220.    
  221.    
  222.     //这并没有创建子类Cat类的对象,因为它是父类Animal的对象
  223.     //所以,再次加载了Animal类的对象init方法!
  224.     //但,加载了Cat类的load方法,因为load方法跟创建没有关系!只要出现了,程序启动就会加载load方法!
  225.     //Cat *ct = [[Animal alloc]init];
  226.    
  227.     //子类对象被创建,它父类对象也会被创建(加载了父类的init方法)
  228.     //Cat *ca = [[Cat alloc]init];
  229.    
  230.     //子类对象被创建,它父类对象也会被创建(加载了父类的init方法),它的父类的父类的对象也被创建
  231.     //每次创建对象,都会加载父类/父类的父类/子类的间接父类的(init)
  232.     //    BsCat *bc = [[BsCat alloc]init];
  233.     //    BsCat *bc2 = [[BsCat alloc]init];
  234.    
  235.     //    Animal *al =[[Animal alloc]init];
  236.     //    Animal *al2 =[[Animal alloc]init];
  237.    
  238.     Cat *ct = [[Cat alloc]init];
  239.    
  240.    
  241.     return 0;
  242. }
复制代码



3.png (236.63 KB, 下载次数: 6)

3.png

0 个回复

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