多态:相同接口,不同实现 相同接口:方法的签名、参数、返回值相同 不同实现:具体实现的内容不同
动态多态包括:
动态类型识别动态绑定动态加载typedef id(*IMP)(id, SEL,...)
@autoreleasepool{Person *a = [[Person alloc] init];[a PRint];SEL act = @selector("print");//act得到print的SEL//或者 SEL act = NSSelectorFromString(@"print");从字符串获得方法的SEL//或者NSSring * name = NSStringFromSelector(act);从const char * sn = sel_getName(act);//用SEL做参数,找到指定的方法,并取得其首地址a.name = @"tom";NSLog(@"%s",sn);IMP p = [a methodForSelector:act];p(a, act);//p就相当于*IMP【typedef id(*IMP)】(id, SEL,...),a相当于self,act即为SELfor (int i=0; i<10000; i++){ //[a print]; p(a, act); }//在循环次数很多的情况下,如果用第一种方法,消息传递的方法名寻找过程很耗费时间,所以如果改进为第二种方法,可以节省很多时间}class-object类对象的写法:[类名或者对象名 class]
-(BOOL)isKindOf:class-object//对象是不是class-object或者其子类的成员-(BOOL)isMemberOfClass:class-object//对像是不是class-object的成员if([object isMemberOf:[someClass class]])//判定是否为某个类的实例对象+(BOOL)isSubclassOfClass:class-object//对象是指定类的子类吗等号右边selector的写法:@selector(方法名、@“字符串”)
-(BOOL)respondToSelector:selector//对象是否能响应selector所指定的方法+(BOOL)instancesRespondToSelector:selector//指定的类对象是否能响应selector消息派发:oc中消息一直到运行时才能绑定到对应的方法
[receiver message];转换成函数 objc_msgSend(receiver, selector); 其中receivier赋值给self, selector就是方法选择器
如果消息是 [super message]; 为了加快消息处理,运行时会缓存映射表,在每个类中查找方法会先在缓存中找,如果找不到再到方法映射表中去找
oc允许在运行时加载一个新类,或给已有的类加载新的方法 只需要四步 1. #import 《objc/runtime.h> 2. 为class pair分配空间 3. 增加方法(class_addMethod)或者实例变量(class_addlvar) 4. 注册新类
#import<objc/runtime.h>//注意引入void sayHello(id self,SEL_cnd,NSString* aHello){ NSLog(@"%@",aHello);}//-(void)sayHello:(NSString*)aHello;上面函数就时这个方法的等价写法//void(*)(id self, SEL_cnd,NSString*);可以看出每个方法都有self和SEL两个隐含参数@autoreleasepool{ Class parentClass=[NSObject class]; Class newClass=objc_allocateClassPair(parentClass,"ASNewClass",0);//为class pair分配空间 Class_addMethod(newClass,@selector(sayHello:),(IMP)sayHello,"v@:@"); //增加方法(class_addMethod)或者实例变量(class_addlvar) objc_registerClassPair(newClass);//注册新类 id p = [[newClass alloc] init]; if([p respondsToSelector:@selector(sayHello:)]){ [p performSelector:@selector(sayHello:) withObject:@"hello world!"]; } }新闻热点
疑难解答