美文网首页
动态数据类型以及对象的初始化

动态数据类型以及对象的初始化

作者: SimpleSJ | 来源:发表于2018-11-05 15:36 被阅读0次

    1.动态数据类型

    • 动态数据类型与静态数据类型
    • 静态类型
      • 将一个指针变量定义为特定类的对象时,使用的是静态类型,在编译的时候就知道这个指针变量所属的类,这个变量总是存储特定类的对象。
        🌰: Person *p = [Person new];
    • 动态类型
      • 这一特性是程序直到执行时才确定对象所属的类
        🌰: id obj = [Person new];
    /*
         静态数据类型的特点: 
         在编译时就知道变量的类型, 
         知道变量中有哪些属性和方法
         在编译的时候就可以访问这些属性和方法, 
         并且如果是通过静态数据类型定义变量, 如果访问了不属于静态数据类型的属性和方法, 那么编译器就会报错
         弊端: 多态中,用父类的指针指向了子类的对象,如果要调用子类特有的方法,必须强转
    */
         动态数据类型的特点:
         在编译的时候编译器并不知道变量的真实类型, 只有在运行的时候才知道它的真实类型
         并且如果通过动态数据类型定义变量, 如果访问了不属于动态数据类型的属性和方法, 编译器不会报错,同时这也是动态数据类型的弊端,容易在运行时崩溃.
         不要滥用动态数据类型.
    

    2.new方法的实现原理

    • new做了三件事情:1.开辟存储空间 2.初始化所有的属性(成员变量) 3.返回对象的地址
    • alloc也是做了三件事(苹果文档中描述): 1.开辟存储空间 2.将所有的属性设置为0 3.返回当前实例对象的地址
    • 默认情况init的实现是什么都没有做,它只是返回初始化后的实例对象的地址
    • 注意:alloc返回的地址, 和init返回的地址是同一个地址
    @interface Person : NSObject
    @property   int age;
    @end
    
    //控制器中调用
    //下面两句的作用是等价的
    
    //分成下面一种写法的原因我认为有二:1.规范编码格式 2.便于自定义构造方法
    //-(instancetype)initWith.... 固定格式
      Person *p1 = [Person new];
      Person *p2 =[[Person alloc]init];
    

    相关文章

      网友评论

          本文标题:动态数据类型以及对象的初始化

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