在目标 C 中执行选择器有什么用?你能告诉我执行选择器和响应选择器之间的区别吗?
3 回答
-respondsToSelector:允许您测试某个对象是否响应给定的选择器,如果您仍然向它发送消息,您的应用程序是否会崩溃。
-performSelector:(withObject:)只是调用某个方法,例如
[object performSelector:@selector(retain)];
将等于
[object retain];
你为什么需要那个?提供了一个方便的示例NSArray
:它允许选择器由它包含的所有对象执行,例如
[self.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
将等于
for (UIView *view in self.subviews)
{
[view removeFromSuperview];
}
而这-makeObjectsPerformSelector:
是更优雅的方式。
respondsToSelector:返回一个布尔值,指示接收者是否实现或继承了可以响应指定消息的方法。
performSelector:向接收者发送指定的消息,并返回消息的结果。
PerformSelector 用于调用您想要执行的方法,这意味着您可以选择不同的选项来执行特定的任务(方法)示例...
– performSelector:withObject:afterDelay: // 将在特定延迟后执行方法.. – performSelector:withObject:afterDelay:inModes: – performSelectorOnMainThread:withObject:waitUntilDone: – performSelectorOnMainThread:withObject:waitUntilDone:modes: – performSelector:onThread:withObject:waitUntilDone : – performSelector:onThread:withObject:waitUntilDone:modes:
– performSelectorInBackground:withObject: // 在后台执行任务。所以,你的 ManinThread(Application) 不会停止响应......就像多线程一样......
直接方法不会提供执行任务的选择。
希望对你有帮助...
performSelector 的典型用法是在您不知道这样做是否有效时向对象发送消息。
例如,假设您@property (assign) id delegate
的界面中有一个,其中id
是指向任何类型对象的指针。即使delegate
is not nil
,您也不知道它是否实现了您在编译代码时为委托创建的正确协议。这样你就可以:
if ([delegate respondsToSelector:@selector(delegateMethod:)]) {
[delegate performSelector:@selector(delegateMethod:)
withObject:param];
}
当您需要检测对象的类型时,也可以使用它。您可以使用performSelector:
来避免类型转换。这也消除了编译时不必要的警告。
对于多线程场景,您可能需要使用以下方法NSObject
:
performSelectorOnMainThread:withObject:waitUntilDone:
performSelectorOnMainThread:withObject:waitUntilDone:modes:
performSelector:onThread:withObject:waitUntilDone:
performSelector:onThread:withObject:waitUntilDone:modes:
performSelectorInBackground:withObject:
参考: