美文网首页
iOS底层应用

iOS底层应用

作者: 小人物_b | 来源:发表于2019-03-04 17:28 被阅读0次

    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");
    
    持续更新……

    相关文章

      网友评论

          本文标题:iOS底层应用

          本文链接:https://www.haomeiwen.com/subject/xngiuqtx.html