1 id类型
id类型是一种通用的对象类型,id可以用来存储什么类型的对象。类似Java的Object。
2 动态绑定
动态绑定也叫多态,是在程序运行期间,根据对象的实际类型进行相应的调用。
#import <Foundation/Foundation.h>
#import "Dog.h"
#import "Cat.h"
int main(){
@autoreleasepool{
id animal;
Dog *dog = [[Dog alloc] init];
Cat *cat = [[Cat alloc] init];
animal = dog;
[animal bark]; //[dog bark];
id = cat;
[animal bark]; //[cat bark];
}
}
上面有两个类型,Dog和Cat,这两个类型都有一个bark方法,狗和猫的叫声不同,方法实现不同。
id类型可以指向任何对象,所以id可以表示Dog和Cat,id类型会跟踪对象的实际类型,运行的时候,id会先判断对象的实际类型,然后再进行调用。而不是编译期间。
所以当id指向dog时,调用的是dog的bark方法,指向cat时,调用cat的方法。
3编译时和运行时检查
因为id类型是在运行时进行判断是什么对象,所以很多错误会在运行时发生。如下:
animal = dog;
[animal dance];
这里的dog并没有dance方法,但是id类型运行时才会检查,所以编译器不会检查,这里会产生找不到方法错误,unrecognized selector to instance
4 类的检查
class: 要获取class对象可以使用class方法。
[Dog class];
[dog class] //dog为类Dog的对象。
if( [obj1 class]==[obj2 class] ) //判断是否是相同的类实例
[ dog isMemberOfClass: [Dog class] ]; //判断dog是否是Dog的成员
selector: @selector( alloc );
SEL sel = @selector ( setNum: );
SEL sel = @selector ( setName: andAge: );
[Dog instancesRespondToSelector: @selector ( setName: andAge: )]; //包含继承的方法
5 异常处理
异常处理跟Java很类似,使用@try{}@catch( NSException *exception ){}块。
如果try块内的代码抛出异常,执行不会终止,而是立即跳到@catch块中,在那里继续执行。
在@catch块中可以处理异常。
@finally和@throw方法的使用跟Java一样。