美文网首页
12-类的本质、类的启动过程(load, initialize)

12-类的本质、类的启动过程(load, initialize)

作者: Giurlo | 来源:发表于2016-04-12 18:04 被阅读37次

    类的本质


    • 本质
      • 类其实也是一个 对象, 这个对象会在这个类第一次被使用的时候创建, 一个类再内存中只有一份类对象
      • 只要有了类对象, 将来就可以通过类对象来创建实例对象
      • 实例对象中有一个isa指针, 指向创建自己的类对象
      • 类对象中保存了当前对象所有的对象方法, 当给一个实例对象发送消息的时候, 会根据实例对象中的isa指针去对应的类对象中查找
    • 如何获取类对象: [实例对象 class]/ [类名 class];
    • 类对象的应用场景:
      • 1用于创建实例对象
      • 2用于调用类方法

    类的启动过程


    • load方法:
      • 只要程序启动就会将所有类的代码加载到内存中, 放到代码区
      • load方法会在当前类被 加载到内存 的时候调用, 有且仅会 调用一次
      • 如果存在继承关系, 会 先调用父类的load方法, 再调用子类的load方法
    • initialize方法:
      • 当前类第一次被使用的时候就会调用(创建类对象的时候)
      • initialize方法在整个程序的运行过程中只会被 调用一次, 无论使用多少次这个类都只会调用一次
      • initialize用于对某一个类进行 一次性的初始化
      • initializeload一样, 如果存在继承关系, 会 先调用父类的initialize, 再调用子类的initialize

    SEL类型


    三种用法

      1. 配合对象/类来 检查 对象/类中有没有实现某一个方法
    SEL sel = @selector(setAge:);
    Person *p = [Person new];
    // 判断p对象中有没有实现-号开头的setAge:方法
    // 如果P对象实现了setAge:方法那么就会返回YES
    // 如果P对象没有实现setAge:方法那么就会返回NO
    BOOL flag = [p respondsToSelector:sel];
    NSLog(@"flag = %i", flag);
    
    • 2.配合对象/类来 调用某一个SEL方法
    SEL sel = @selector(demo);
    Person *p = [Person new];
    // 调用p对象中sel类型对应的方法
    [p performSelector:sel];
        
    SEL sel1 = @selector(signalWithNumber:);
    // withObject: 需要传递的参数
    // 注意: 如果通过performSelector调用有参数的方法, 那么参数必须是对象类型,
    // 也就是说方法的形参必须接受的是一个对象, 因为withObject只能传递一个对象
    [p performSelector:sel1 withObject:@"13838383438"];
        
    SEL sel2 = @selector(setAge:);
    [p performSelector:sel2 withObject:@(5)];
    NSLog(@"age = %i", p.age);
        
    // 注意:performSelector最多只能传递2个参数
    SEL sel3 = @selector(sendMessageWithNumber:andContent:);
    [p performSelector:sel3 withObject:@"138383438" withObject:@"abcdefg"];
    
    • 3.配合对象 将SEL类型作为方法的形参
    Car *c = [Car new];
    SEL sel = @selector(run);
        
    Person *p = [Person new];
    [p makeObject:c andSel:sel];// 调用传入对象的指定方法, 此处是c的run方法
    

    相关文章

      网友评论

          本文标题:12-类的本质、类的启动过程(load, initialize)

          本文链接:https://www.haomeiwen.com/subject/dblwlttx.html