1、OC runTtime 封裝
@interface RunTimeHelper:NSObject
+ (NSString*) runTimeCallByMethod:(NSObject*) obj objMethod:(NSString*) callMethod argrStr:(NSString*) argrStr;
@end
#import "RunTimeHelper.h"
#import <objc/runtime.h>
#import <objc/message.h>
@implementation RunTimeHelper
+ (NSString*) runTimeCallByMethod:(NSObject*) obj objMethod:(NSString*) callMethod argrStr:(NSString*) argrStr {
unsigned int count;
//遍歷方法列表
Method *methods = class_copyMethodList([obj class], &count);
for (int i = 0; i < count; i++ ){
Method method = methods[i];
SEL selector = method_getName(method);
char * ty = method_copyReturnType(method);
int number = method_getNumberOfArguments(method);
NSString* resultType = [NSString stringWithUTF8String:ty];
NSString *name = NSStringFromSelector(selector);
NSString* newName = [name stringByReplacingOccurrencesOfString:@":" withString:@""];
if([callMethod isEqualToString:newName]){
//判斷返回值爲void 不接受返回值
if( [resultType isEqualToString:@"v"] ){
//調用有參數的
if(number > 2){
NSString* str = objc_msgSend(obj,selector,argrStr);
//拿到返回值進行回調
return str;
}else{
objc_msgSend(obj,selector);
}
}else{
//調用無參數的
if(number > 2){
NSString* str = objc_msgSend(obj,selector,argrStr);
//拿到返回值進行回調
return str;
}else{
objc_msgSend(obj,selector);
}
}
}
}
return @"";
}
@end
2、測試runTtime
//--------定義類
@interface Person : NSObject
- (NSString*) getRandom;
- (NSString*) getRandom:(NSString*) str;
@end
@implementation Person
- (NSString*) getRandom{
NSLog(@"======沒有型參,有返回值====");
return @"返回值";
}
- (NSString*) getRandom:(NSString*) str{
NSLog(@"=====有型參,有返回值======%@=",str);
return @"返回值帶參數的";
}
- (void) getRandom2{
NSLog(@"=======沒有返回值");
}
@end
[RunTimeHelper runTimeCallByMethod:[[Person alloc]init] objMethod:@"getRandom2" argrStr:nil];