ios - id a = [target performSelector:action withObject:params],a的值是什么

 傻傻的笑没心没肺wy 发布于 2022-10-30 01:57

我在网上找到一份关于组件化的代码,里面有这样一段代码

- (id)performTarget:(NSString *)targetName action:(NSString *)actionName params:(NSDictionary *)params shouldCacheTarget:(BOOL)shouldCacheTarget
{
    
    NSString *targetClassString = [NSString stringWithFormat:@"Target_%@", targetName];
    NSString *actionString = [NSString stringWithFormat:@"Action_%@:", actionName];
    
    id target = self.cachedTarget[targetClassString];
    if (target == nil) {
        Class targetClass = NSClassFromString(targetClassString);
        target = [[targetClass alloc] init];
    }
    
    SEL action = NSSelectorFromString(actionString);
    
    if (target == nil) {
        // 这里是处理无响应请求的地方之一,这个demo做得比较简单,如果没有可以响应的target,就直接return了。实际开发过程中是可以事先给一个固定的target专门用于在这个时候顶上,然后处理这种请求的
        return nil;
    }
    
    if (shouldCacheTarget) {
        self.cachedTarget[targetClassString] = target;
    }
    
    if ([target respondsToSelector:action]) {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
        return [target performSelector:action withObject:params];
#pragma clang diagnostic pop
    } else {
        // 这里是处理无响应请求的地方,如果无响应,则尝试调用对应target的notFound方法统一处理
        SEL action = NSSelectorFromString(@"notFound:");
        if ([target respondsToSelector:action]) {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
            return [target performSelector:action withObject:params];
#pragma clang diagnostic pop
        } else {
            // 这里也是处理无响应请求的地方,在notFound都没有的时候,这个demo是直接return了。实际开发过程中,可以用前面提到的固定的target顶上的。
            [self.cachedTarget removeObjectForKey:targetClassString];
            return nil;
        }
    }
}

其中让我困惑的代码片段是这句话

return [target performSelector:action withObject:params];

我查看这段代码的定义,返回的是一个id值

- (id)performSelector:(SEL)aSelector withObject:(id)object;

真实运行代码的时候,也是返回了想要的结果,如截图

但是问题来了,我自己运行代码的时候,却一直崩溃,我的代码如下:

    NSString *targetClassString = [NSString stringWithFormat:@"Test"];
    NSString *actionString = [NSString stringWithFormat:@"t"];
    
    Class targetClass = NSClassFromString(targetClassString);
    id target = [[targetClass alloc] init];
    
    SEL action = NSSelectorFromString(actionString);
    
    if ([target respondsToSelector:action]) {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
        id a = [target performSelector:action withObject:nil];
        NSLog(@"%@",a);
#pragma clang diagnostic pop
    }

截图:

请问我是哪里配置有问题吗,还是哪里出错了,我现在没有头绪,希望大神们能帮帮忙

1 个回答
  • 额...我知道了,id a 的值,就是自己定义方法的返回值,返回空的话,打印就会为崩溃

    2022-10-31 19:26 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有