【问题标题】:causing a leak via performSelector with NSSelectorFromString?通过带有 NSSelectorFromString 的 performSelector 导致泄漏?
【发布时间】:2012-08-22 00:18:17
【问题描述】:

我正在尝试为我的游戏的关卡类创建一个相当动态的 api……基本上,我只有一堆类方法 optionsForLevel1、optionsForLevel2、……等等,它们都返回一个字典对象,其中包含类似的东西关卡应该有多少时间,有多少奖励积分,关卡名称等等......

在我的实际游戏对象中,当需要升级关卡时,它会调用关卡对象上的一个方法:

+(NSDictionary*)performClassSelectorForLevel:(int)identifier {
    SEL sel = NSSelectorFromString([NSString stringWithFormat:@"optionsForLevel%d", identifier]);
    return [self performSelector:sel];
}

这给了我一个警告:PerformSelector 可能会导致泄漏,因为它的选择器是未知的。

...

我该如何解决这个警告?

【问题讨论】:

标签: objective-c ios


【解决方案1】:

这很有趣。你不能。不是我的经验。这只是一个警告,而不是错误,这“可能”导致泄漏。

当使用performSelector: 时,你有责任确保它不会泄漏,当然编译器不知道NSString 中的选择器,它在编译时是未知的,因为它的值会分配在运行时。

您可以隐藏此警告,但可以忽略

查看此答案了解更多详情:PerformSelector warning

【讨论】:

  • 不能忽略警告。虽然看起来很迂腐,但编译器是正确的,因为它无法知道泄漏不是由该调用引起的。消除使用performSelector: 和变体是一个更好的长期策略。
【解决方案2】:

警告是由编译器生成的,因为 ARC 需要知道该方法可能返回的对象类型,以确保内存没有管理不善。

更多详情请点击此处:performSelector may cause a leak because its selector is unknown

【讨论】:

    猜你喜欢
    • 2013-08-04
    • 1970-01-01
    • 2021-08-11
    • 2011-10-24
    • 2011-07-07
    • 1970-01-01
    • 1970-01-01
    • 2012-10-30
    相关资源
    最近更新 更多