Objective-C runtime之消息转发机制(三)
学了那么久的Objective-C,给我的感觉就是它什么都是动态的,你将会听到一个新的名词:
一、动态方法解析
1、+(BOOL) resolveInstanceMethod:(SEL) sel
这是NSObject根类提供的类方法,调用时机为当被调用的方法实现部分没有找到,而消息转发机制启动之前的这个中间时刻。
2、@dynamic关键字
Objective-C2.0 提供了@dynamic关键字,从名字上可以看出来,它一定是跟动态相关的。猜对了,这个关键字告诉编译器,某个属性的实现是动态的。如果我们在@interface接口文件中声明了一个属性,如下所示:
@property(nonatomic,retain) NSString *name;在@implementation文件中做了如下声明:
@dynamic name;就表示编译器须动态地生成该属性对应的方法。如果想将该属性的-(void)setName:(NSString *)name方法用dynamicMethodIMP函数来代替,可以这样做:
-(void)forwardInvocation:(NSInvocation *)invocation{SEL invSEL = invocation.selector;if ([someOtherObject respondsToSelector:invSEL])[anInvocation invokeWithTarget:someOtherObject];} else {[self doesNotRecognizeSelector:invSEL]; } }
怎么看着有点像多继承呀???你说对了,消息转发提供了多重继承的很多特性。然而,两者有很大的不同:多重继承是将不同的行为封装到单个的对象中,有可能导致庞大的,复杂的对象。而消息转发是将问题分解到更小的对象中,但是又以一种对消息发送对象来说完全透明的方式将这些对象联系起来。总之,Objective-C通过这种方式,一定程度上减小了自己不支持多继承的劣势。
经过半个月的时间,自己总结、整理出了这三篇文章,到这里,对Objective-C运行时的学习算是告一段落了。文笔的原因,文章结构不是很清晰,还请见谅。对运行时理解不到位,或者是有错误的地方,还请广大博友指出,感激不尽!