如何在 performSelector: withObject:afterDelay 的Object里传入多个参数

写代码的时候可能会遇到如下的问题
一个方法

- (void) fooFirstInput:(NSString*) first secondInput:(NSString*) second
{

}

有两个或者多个参数
当需要执行performSelector方法并且afterDelay的时候,withObject只能传入一个参数,并且也没有对应的withObjects方法,
这么写是不对的。会报错
[self performSelector:@selector(fooFirstInput:secondInput:) withObject:@"first" withObject:@"second" afterDelay:15.0];

遇到这种情况利用如下的一个小方法可以满足调用多个参数的select method
1.
- (void) callFooWithArray: (NSArray *) inputArray
{
    [self fooFirstInput: [inputArray objectAtIndex:0] secondInput: [inputArray objectAtIndex:1]];
}

- (void) fooFirstInput:(NSString*) first secondInput:(NSString*) second
{

}

2.
[self performSelector:@selector(callFooWithArray) withObject:[NSArray arrayWithObjects:@"first", @"second", nil] afterDelay:15.0];
<think>好的,我现在需要帮助用户解决关于iOS开发中废弃方法的问题。用户提到的是[object performSelector:@selector(openURL:) withObject:destinationURL]; 这个方法被废弃了,想知道替换方法是什么。 首先,我得确认这个方法的上下文。performSelector:withObject:通常用于动态调用方法,而这的具体方法是openURL:,这应该是用于打开URL的功能。在iOS中,打开URL通常涉及到UIApplication的openURL方法。 接下来,我需要回忆一下iOS版本的变化。记得从iOS 10开始,苹果引入了一些新的API,并且废弃了一些旧的方法。特别是UIApplication的openURL被替换为openURL:options:completionHandler:方法。不过,用户这使用的是performSelector来调用openURL:,所以可能需要直接替换为新的方法调用方式。 另外,还需要考虑线程问题。原来的performSelector如果在主线程之外调用可能会有问题,而新的方法可能要求在主线程执行。此外,用户可能还需要处理选项参数和完成回调,不过如果不需要这些,可以递nil或者空的字典。 然后,我需要检查是否有相关的官方文档或开发者资源支持这一点。例如,苹果的UIApplication文档中确实提到openURL:在iOS 10后被废弃,推荐使用带有options和completion handler的新方法。因此,正确的替换应该是使用UIApplication的shared实例调用openURL:options:completionHandler:方法,递适当的参数。 用户原来的代码是通过performSelector动态调用openURL:,这可能是因为他们想动态地调用方法,或者有其他特定需求。但一般来说,直接调用新方法是更好的选择。因此,建议用户将代码改为使用新方法,并处理可能的选项和完成回调。 最后,我需要将这个过程整理成一个清晰的步骤,说明废弃原因、推荐替换方法以及示例代码,同时提醒线程安全和参数处理的问题。确保用户能够理解如何迁移他们的代码到新的API,并避免常见的错误。</think>在 iOS 开发中,`performSelector:withObject:` 结合 `openURL:` 的方式已被废弃,以下是替代方案的具体说明: --- ### 废弃原因 旧方法 `[object openURL:url]` 和通过 `performSelector` 的间接调用方式存在以下问题: - 缺少异步回调机制 - 无法指定打开 URL 的附加选项 - 存在线程安全隐患 - 不符合现代 API 设计规范 --- ### 推荐替代方案(iOS 10+) 使用 `UIApplication` 的现代 API: ```objective-c [[UIApplication sharedApplication] openURL:destinationURL options:@{} completionHandler:^(BOOL success) { // 可选:处理打开结果 NSLog(@"URL打开%@", success ? @"成功" : @"失败"); }]; ``` --- ### 关键改进说明 1. **线程安全**:新方法自动在主线程执行 2. **扩展选项**(常用选项示例): ```objective-c @{ UIApplicationOpenURLOptionUniversalLinksOnly : @YES, // 仅通过通用链接打开 UIApplicationOpenURLOptionAnnotationKey : @"customData" // 携带附加数据 } ``` 3. **异步回调**:可准确获知打开操作结果 4. **兼容性**:需 iOS 10+,如需支持旧系统需做版本判断 --- ### 迁移注意事项 - 若仍需使用 `performSelector` 机制(不推荐),应改为: ```objective-c [object performSelector:@selector(openURL:options:completionHandler:) withObject:destinationURL withObject:@{}]; // 注意:此方式无法正确递 completionHandler 块 ``` - 对于 Swift 项目应使用: ```swift UIApplication.shared.open(destinationURL, options: [:]) { success in // 处理回调 } ``` 建议直接使用标准调用方式以确保代码可维护性和功能完整性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值