運行時進行編程,類似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 則不行。