利用Objective-C的反射機制和執行時特性實現類靜態方法的動態訪問(二)
阿新 • • 發佈:2019-01-27
繼上次的研究成果繼續深入研究,灑家又完善了下在執行時動態呼叫所有OC類方法的公用方法:
typedef void*(*ObjcMsgSend)(id, SEL, ...); - (void *)invoke:(id)inst method:(NSString *)name,... { SEL sel = NSSelectorFromString(name); IMP imp = [inst methodForSelector:sel]; ObjcMsgSend objcMsgSend = (void *)imp; va_list params; va_start(params, name); void *first = va_arg(params, void*); void *result = objcMsgSend(inst, sel, first, params); va_end(params); return result; }
經過反覆測試,此方法目前還有一個使用限制,貌似只能使用於方法返回值為指標或者id型別的方法,如果是返回基本C型別或者結構體等卻只能得到指向返回型別的指標的地址值而不能得到返回型別自身的值。說白了,OC的IMP型別貌似不是個模板型別,它不像Java的泛型型別,可以表示任何物件型別!看來還得繼續研究下,看看是否能找到一個完美的解決辦法!