runtime 項目實戰方法處理

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];
   

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章