zoukankan      html  css  js  c++  java
  • 黑马程序员___OC类的加载和初始化

    构造方法

    完整的创建一个可用的对象需要两步

    1.分配储存空间   +alloc

    2.初始化   -init

    Person *p1 = [Person alloc]

    Person *p2 = [p1 init]

    相当于:Person *p = [Person new] ,但是这个方法虽然可以快速创建一个新的对象,但是不能对新对象进行有选择的初始化

    有时候我们想创建的对象都有一个初始值,这个时候就可以重写构造方法

    - (id)init
    {
        //一定要调用回super的init方法,初始化父类中声明的一些成员变量和其他属性
        self = [super init];
    
        //如果初始化成功,才有必要进行接下来的初始化
        if(self != nil)
        {
            _age = 10;  //使创建出来的age属性都是等于10
        }
        return self;
    }

    重写构造方法的注意点

    1.先调用父类的构造方法[super init]

    2.再进行子类内部成员变量的初始化

    补充:

    id :万能指针,能指向任何OC对象

    类的本质

    类本身也是一个对象,是个Class类型的对象,简称类对象  Class c = [Person class],利用Class创建Person对象。

    类的加载和初始化

    当程序启动时,会加载项目中所有的类和分类,而且加载后回调用每个类和分类的+load方法,而且只会调用一次

    当第一次使用某个类创建对象的时候,就会调用当前类的+initialize方法,也就是初始化对象,使创建出来的对象可以使用

    规律:

    程序启动时,系统会先加载父类,再加载子类(先调用父类的+load方法,再调用子类的+load方法)

                            先初始化父类,再初始化子类(先调用父类的+initialize方法,再调用子类的+initialize方法)

    SEL

    SEL是对方法的一种包装,将方法包装成一个SEL类型的数据,去找对应的方法地址。找到方法地址就可以调用方法

    [p test]  —>直接的调用test方法

    SEL s = @selector(test)

    [p performSelector:s] —>间接的调用test方法

    在方法内部_cmd表示当前方法的SEL值,所以在方法实现的内部使用_cmd会引发死循环,比如:

    - (void)test2
    {
        // _cmd代表着当前方法
        
        NSString *str = NSStringFromSelector(_cmd);
        
        // 会引发死循环
        // [self performSelector:_cmd];
        
        NSLog(@"调用了test2方法-----%@", str);
    }
  • 相关阅读:
    分布式锁原理及实现方式
    【FAQ】Maven 本地仓库明明有jar包,pom文件还是报错解决办法
    【FAQ】tomcat启动jdk版本不一致
    【Map,HashMap,Vector,List】资料汇总
    【FAQ】调用接口序列化问题
    【docker】docker下安装mysql
    linux tcpdump抓包Post请求
    Springboot 在@Configuration注解的勒种 使用@Autowired或者@value注解 读取.yml属性失败
    Springboot使用Shiro-整合Redis作为缓存 解决定时刷新问题
    CentOS yum 安装nginx
  • 原文地址:https://www.cnblogs.com/jia694600474/p/4009758.html
Copyright © 2011-2022 走看看