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];
网友评论