1、调用私有方法
已创建一个FirstObj 类,其中有一个方法
- (void)first_Method1:(NSString *)str1 andParm:(NSString *)str2
{
NSLog(@"params = %@,%@",str1,str2);
}
如何调用这个私有方法?
unsigned int count = 0;
Method *methods = class_copyMethodList([FirstObj class], &count);
NSMutableArray *paramsArr = [NSMutableArray array];
for(int i=0;i<count;i++){
[paramsArr removeAllObjects];
Method md = methods[i];
SEL sel = method_getName(md);
NSLog(@"方法名:%@",NSStringFromSelector(sel));
unsigned int argumentCounts = method_getNumberOfArguments(md);
char argInfo[512] = {};
for(int j=0;j<argumentCounts;j++){
//获取参数类型
method_getArgumentType(md, j, argInfo, 512);
[paramsArr addObject:[NSString stringWithFormat:@"%s",argInfo]];
memset(argInfo, '\0', strlen(argInfo));
}
//"@"表示对象 ":"表示方法
//可以看到paramsArr 有4个参数
//在OC中用c语言的方式定义方法必须要2个参数 id,__cmd,这里是2个隐藏参数
//所以我们可以看到 前2个参数分别是 "@" ":"
//因此从第三个开始才是私用方法的参数类型
NSLog(@"参数类型:%@",paramsArr);
char retType[512] = {};
method_getReturnType(md, retType, 512);
NSLog(@"返回值类型:%s",retType);
}
free(methods);
FirstObj *fo = [[FirstObj alloc]init];
//调用私有方法
SEL sel = @selector(first_Method1:andParm:);
//方法1
[fo performSelector:sel withObject:@"wang" withObject:@"jian"];
//方法2
objc_msgSend(fo,sel,@"wang",@"bang");
//方法3
// IMP imp1 = [fo methodForSelector:sel];
IMP imp1 = class_getMethodImplementation([FirstObj class], sel);
void (* tmpFun)(id target,SEL sel,NSString *,NSString *) = (void *)imp1;
tmpFun(fo,sel,@"wang",@"jian");
网友评论