[iOS]消息转发-基元修改

2020-07-03  本文已影响0人  汴城码农

工作笔记

描述:我想要做的是将调用转发给一个或另一个选择器,具体取决于它是对象还是基本类型.最终目标是我想“封装”基元,以便将它们添加到数组/字典中
/**
 * 类型对照表
 * https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtTypeEncodings.html
 */
-(void)forwardInvocation:(NSInvocation *)anInvocation{
    if (anInvocation.methodSignature.numberOfArguments>2) {
        for (int i= 2; i<anInvocation.methodSignature.numberOfArguments; i++) {
            
//            void * arg;
//            [anInvocation getArgument:&arg atIndex:i];
//            //id args = (__bridge id) arg;
//            id args = (__bridge_transfer id)arg;
            
            __unsafe_unretained id argument;
            [anInvocation getArgument:&argument atIndex:2];
                        
            NSMethodSignature *signature = [anInvocation methodSignature];
            const char* argType = [signature getArgumentTypeAtIndex:i];
            const NSString *typeStr = [NSString stringWithFormat:@"%s",argType];

            if ([typeStr isEqualToString:@"q"]) { //目前所有参数都是NSString类型,如果weex传的参数类型不对,容错处理转为NSString
                NSString * argumentStr= [NSString stringWithFormat:@"%qu",argument];
                const char *cString = [argumentStr cStringUsingEncoding:NSUTF8StringEncoding];
                [anInvocation setArgument:cString atIndex:i];
            }
        }
    }
}

参考

上一篇 下一篇

猜你喜欢

热点阅读