Ios 在objective-c中使用PerformSelect有危险吗?

Ios 在objective-c中使用PerformSelect有危险吗?,ios,objective-c,performselector,Ios,Objective C,Performselector,我被Crashlytics上的一次崩溃困住了几天,它说: libobjc.A.dylib objc\u msgSend 我设法指出了这次崩溃的原因:\uu\nsthreadperform 通过在堆栈上进行少量搜索,它似乎与性能选择器:withObject:afterDelay: 我的代码一直提到延迟0。我使用这个方法,通过从我从枚举状态访问的字符串数组中动态地重新创建选择器,来调用我们在iOS中可以称之为“functor”的内容 基本上,这是我从这里得到的所有信息,我了解到,后延迟:使您的呼叫延

我被Crashlytics上的一次崩溃困住了几天,它说:

libobjc.A.dylib

objc\u msgSend

我设法指出了这次崩溃的原因:\uu\nsthreadperform

通过在堆栈上进行少量搜索,它似乎与性能选择器:withObject:afterDelay:

我的代码一直提到延迟0。我使用这个方法,通过从我从枚举状态访问的字符串数组中动态地重新创建选择器,来调用我们在iOS中可以称之为“functor”的内容

基本上,这是我从这里得到的所有信息,我了解到,后延迟:使您的呼叫延迟到下一个RunLoop。它是否也适用于性能选择器:withObject:afterDelay:为导致此问题的方法添加了某些内容

最后,真正的问题是:

是performSelector:withObject:afterDelay:生成函子的好方法,还是像这样使用它很危险?我应该用其他方法吗?


提前感谢,

不要仅仅假设您的对象仍然存在并且可以执行选择器。先测试一下

if ([someObject respondsToSelector:@selector(someSelector)]) {
   [someObject performSelector:@selector(someSelector) withObject:nil];
}

正如Objective-C中的所有内容一样,performSelector对于开发人员来说很容易出错,并可能导致大量objc_msgSend崩溃。这个错误主要是由于在错误的对象上调用选择器(您应该调用的对象可能已解除分配)导致的。是的,但我知道这类情况,这是使用指针时崩溃的“正常方式”。但在这里,我看不到在调用对象的那一刻如何释放对象,即使它等到下一次运行循环时,如果我只使用IBOutlet停留在同一个ViewController上,我的对象如何释放。这可能是由“内存警告”问题引起的吗?ARC应该为这种情况保留重要的资源,不是吗?尝试为调试方案启用僵尸模式。复制崩溃,它会告诉你出了什么问题。呃,真正的问题是我无法复制崩溃,直到现在我才在Crashlytics报告中看到它,当我试图以任何方式复制它时,通过对我的应用程序做非常糟糕的事,它从未发生过。我将尝试启用僵尸,也许它会在我无法使用Xcode的基本调试器时崩溃。非常感谢,我不知道我怎么会忘记这个哈哈。对象不存在(变量为
nil
)不是问题。对象不执行选择器将是一个问题,但这将表明该对象不是程序员所认为的对象。