年年有"余"

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2699|回复: 0

深入浅出谈OC中的类

[复制链接]
  • TA的每日心情
    奋斗
    2022-12-13 21:26
  • 签到天数: 371 天

    [LV.9]以坛为家II

    发表于 2014-3-18 12:21:25 | 显示全部楼层 |阅读模式
    该示例主要为了说明以下几点:
    1、OC中的类其实也是一个对象,这种对象称为类对象,Class类型;
    2、通过调用类或对象的class方法可以返回该类的地址,返回数据类型为Class;
    3、各类中都存在一个load方法与initialize方法,这两个方法为类方法;
    4、load方法在程序加载时即刻被调用,与是否使用该类无关,并且分类中的load方法也会被同时调用;
    5、initialize方法则是在该类被使用时调用,并且会将其父类的initialize首先被调用;
    6、不使用的类,initialize方法不会被使用;

    实现代码参考:

    Person.h
    1. //
    2. //  Person.h
    3. //  Class-1
    4. //
    5. //  Created by yusian on 14-3-18.
    6. //  Copyright (c) 2014年 小龙虾论坛. All rights reserved.
    7. //
    8. #import <Foundation/Foundation.h>
    9. @interface Person : NSObject
    10. {
    11.     int _age;
    12. }
    13. @end
    复制代码

    Person.m
    1. //
    2. //  Person.m
    3. //  Class-1
    4. //
    5. //  Created by yusian on 14-3-18.
    6. //  Copyright (c) 2014年 小龙虾论坛. All rights reserved.
    7. //
    8. #import "Person.h"
    9. @implementation Person
    10. // 重写类方法(void)load, 目的在于能够直观地展示该方法被调用;
    11. + (void)load
    12. {
    13.     NSLog(@"Person_load...");
    14. }
    15. // 重写类方法(void)initialize,原因同上
    16. + (void)initialize
    17. {
    18.     NSLog(@"Person_initialize...");
    19. }
    20. @end
    复制代码

    Student.h
    1. //
    2. //  Student.h
    3. //  Class-1
    4. //
    5. //  Created by yusian on 14-3-18.
    6. //  Copyright (c) 2014年 小龙虾论坛. All rights reserved.
    7. //
    8. #import "Person.h"
    9. @interface Student : Person
    10. @end
    复制代码

    Student.m
    1. //
    2. //  Student.m
    3. //  Class-1
    4. //
    5. //  Created by yusian on 14-3-18.
    6. //  Copyright (c) 2014年 小龙虾论坛. All rights reserved.
    7. //
    8. #import "Student.h"
    9. @implementation Student
    10. // load方法在程序加载时即被调用,与该类是否有过使用没有关系;
    11. + (void)load
    12. {
    13.     NSLog(@"Student_load...");
    14. }
    15. // initialize在该类使用时被调用,并用父类的initialize方法也同样会被调用
    16. + (void)initialize
    17. {
    18.     NSLog(@"Student_initialize...");
    19. }
    20. @end
    复制代码

    Boy.h
    1. //
    2. //  Boy.h
    3. //  Class-1
    4. //
    5. //  Created by yusian on 14-3-18.
    6. //  Copyright (c) 2014年 小龙虾论坛. All rights reserved.
    7. //
    8. #import "Student.h"
    9. @interface Boy : Student
    10. @end
    复制代码

    Boy.m
    1. //
    2. //  Boy.m
    3. //  Class-1
    4. //
    5. //  Created by yusian on 14-3-18.
    6. //  Copyright (c) 2014年 小龙虾论坛. All rights reserved.
    7. //
    8. #import "Boy.h"
    9. @implementation Boy
    10. // 无论父类子类,只要是类,程序执行时该方法即被调用
    11. + (void)load
    12. {
    13.     NSLog(@"Boy_load...");
    14. }
    15. // 子类可以很好地展示父类相关方法的动作
    16. + (void)initialize
    17. {
    18.     NSLog(@"Boy_initialize...");
    19. }
    20. @end
    复制代码

    Student+load.h
    1. //
    2. //  Student+load.h
    3. //  Class-1
    4. //
    5. //  Created by yusian on 14-3-18.
    6. //  Copyright (c) 2014年 小龙虾论坛. All rights reserved.
    7. //
    8. #import "Student.h"
    9. @interface Student (load)
    10. @end
    复制代码


    Student+load.m
    1. //
    2. //  Student+load.m
    3. //  Class-1
    4. //
    5. //  Created by yusian on 14-3-18.
    6. //  Copyright (c) 2014年 小龙虾论坛. All rights reserved.
    7. //
    8. #import "Student+load.h"
    9. @implementation Student (load)
    10. // 分类中的load方法在程序加载时也会被被调用,并且与主类中的load方法不冲突,两个load方法同时被调用,这与initialize不一样;
    11. + (void)load
    12. {
    13.     NSLog(@"Student+load_load...");
    14. }
    15. // 在分类中,initialize方法会替换主类中的该方法,即优先被调用,并且是在该类使用时被调用,与是否使用分类中的方法无关
    16. //+ (void)initialize
    17. //{
    18. //    NSLog(@"Student+load_initialize...");
    19. //}
    20. @end
    复制代码

    main.m
    1. //
    2. //  main.m
    3. //  Class-1
    4. //
    5. //  Created by yusian on 14-3-18.
    6. //  Copyright (c) 2014年 小龙虾论坛. All rights reserved.
    7. //
    8. #import <Foundation/Foundation.h>
    9. #import "Student+load.h"
    10. #import "Person.h"
    11. #import "Student.h"
    12. #import "Boy.h"
    13. // 声明用来说有问题的三个函数,具体函数作用在实现部分有做说明
    14. void classTest();
    15. void loadTest();
    16. void initializeTest();
    17. // 分别调用各功能函数来说明相关问题
    18. int main()
    19. {
    20.    
    21.     classTest();
    22.    
    23. //    loadTest();
    24.    
    25. //    initializeTest();
    26.    
    27.     return 0;
    28. }
    29. // 该方法的作用在于,说明类其实也是一个对象,只不过是一种类类型(Class 类型)的对象
    30. void classTest()
    31. {
    32.     // 创建一个Person对象p,并进行初始化,同时说明p是一个(Person *)类型的数据
    33.     Person * p = [[Person alloc] init];
    34.    
    35.     // 通过对象的class方法可以获取到该类的返回类型及地址,即返回类型为Class,c1为对象p所属类型的地址
    36.     Class c1 = [p class];
    37.    
    38.     // 通过返回的类型值,再次进行class类方法操作同样返回的是Class类型的地址,得到c2,c2为c1所属类型的地址
    39.     Class c2 = [c1 class];
    40.    
    41.     // 通过c1与c2的输出可以看到,c1其实就是c2,即(Person *)的地址,p事实上是对象p的地址
    42.     NSLog(@"p=%p, c1=%p, c2=%p", p, c1, c2);
    43.    
    44. }
    45. // load方法在程序加载时即被调用,所以该不做任何事情也可以得到各类的load方法被调用的输出结果,包含分类中的load方法
    46. void loadTest()
    47. {
    48. }
    49. // initialize方法是在该类第一次使用时调用,并且其父类的initialize也同时被调用,但如果不使用该类,则其initialize方法不被调用,比如说子类中的initialize方法;
    50. void initializeTest()
    51. {
    52.    
    53. //    使用Person对象,则Person类中的initialize方法被调用
    54. //    Person * p = [[Person alloc] init];
    55. //
    56. //    使用Student对象,则Person类与Student类中的initialize方法都会被调用,并且首先调用父类中的initialize方法,子类Boy中的initialize方法则不会被调用
    57. //    Student * s = [[Student alloc] init];
    58. //
    59. //    使用Boy类难以上结论
    60. //    Boy * b = [[Boy alloc] init];
    61. }
    复制代码


    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    手机版|小黑屋|Archiver|iOS开发笔记 ( 湘ICP备14010846号 )

    GMT+8, 2024-5-6 00:49 , Processed in 0.046345 second(s), 19 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表