1. 弱语言和强语言的区别.
编译器在编译的时候.语法检查的时候没有那么严格.
不管你怎么写都是可以的.
int num = 12.12;
优点:灵活咋个行都写.
缺点:太灵活
强类型的语言:编译器在编译的时候做语法检查的时候行就是行不行就是不行.
2.静态类型和动态类型
静态类型:
指的是1个指针指向的对象是1个本类对象.
动态类型:
指的是1个指针指向的对象不是本类对象.
3. 编译检查和运行检查.
编译检查
编译器在编译的时候,能不能通过1个指针去调用指针指向的对象的方法.
判断原则:看指针所属的类型之中是有这个方法,如果有就认为可以调用编译通过.
如果这个类中没有那么编译报错.
这个叫做编译检查.在编译的时候能不能调用对象的方法主要是看指针的类型.
我们可以将指针的类型做转换,来达到骗过编译器的目的.
运行检查.
编译检查只是骗过了编译器.但是这个方法究竟能不能执行.
所以在运行的时候.运行时会去检查对象中是否真的有这个方法.如果有就执行如果没有就报错误.
代码里可以在执行的时候检查一下
1). 判断对象中是否有这个方法可以执行.
- (BOOL)respondsToSelector:(SEL)aSelector;
2). 判断类中是否有指定的类方法.
+ (BOOL)instancesRespondToSelector:(SEL)aSelector;
3). 判断指定的对象是否为 指定类的对象或者子类对象.
- (BOOL)isKindOfClass:(Class)aClass;
4). 判断对象是否为指定类的对象 不包括子类.
- (BOOL)isMemberOfClass:(Class)aClass;
5). 判断类是否为另外1个类的子类.
+ (BOOL)isSubclassOfClass:(Class)aClass;
4 父子类指针和对像互指
父类指针指向子类对象.
实际上任意的指针可以执行任意的对象.编译器是不会报错的.父指针指向子类对象,因为子类继承了父类的所有属性,使用的时候,只能获得父类中有的方法和属性,而子类中拥有父类中的 所有方法和属性,在运行的时候,也不会报错。
当1个子类指针指向1个父类对象的时候,如果调用了子类中的特有方法,编译器运行通过子类指针去调用子类独有的方法.编译不会出错
但是在运行的时候是会出问题的.因为父类对象中根本没有子类成员.