運行時進行編程,相似Java的反射。運行時編程和Java反射的對好比下:
1.相同點
均可以實現的功能:獲取類信息、屬性設置獲取、類的動態加載(NSClassFromString(@「className」))、方法的動態調用
下面是iOS中涉及到的相關使用方法
類的動態加載:NSClassFromString(@「className」),
方法的動態調用:
NSSelectorFormString(@」doSonethingMethod:」)
常見的方法:
isKindOfClass: isMemberOfClass: ; respondsToSelector: ; conformsToProtocol: ; methodForSelector: (提供實現方法的地址)
給對象發消息的格式:[receiver message]
objc_msgSend(receiver,selector)
objc_msgSend(receiver,selector,arg1,arg2,...)
動態方法解決:@dynamic propertyName;
消息轉發: 消息negotiate負責轉發
- negotiate
{
if ( [someOtherObject respondsTo:@selector(negotiate)] )
return [someOtherObject negotiate];
return self;
}
2.不一樣點:objective-c能動態的給class添加類和方法,Java 則不行。例如:
下面是iOS中涉及到的相關使用方法
API(#import<objc/runtime.h>)
Class newClz =objc_allocateClassPair([NSError class],」RuntimeErrorSubclass」,0);
class_addMethod(newClz,@selector(retort), (IMP)ReportFunction, 「v@:」);
shiyongobjc_allocateClassPair動態函數建立一個類,並在參數中指明該類的父類和類名。用class_addMethod函數爲該類增長了一個方法report,這個方法是由函數ReportFunction實現的,因爲該函數至少應包含兩個參數self和_cmd,所以該方法有3個參數,類型分別爲v、@、:(一個返回值,self,_cmd)。
3.深層次對比
動態機制:Objective-C runtime 對 class method 的調用是經過全局名稱查詢。而 Java VM 是經過相似 C++ 的虛表機制。因此 Objective-C 能動態的給 class 添加方法,Java 則不行。