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

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

作者: 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