我可以通过执行以下操作在我的应用程序中完成相同的任务:
[self performSelector:@selector(displayOneLife)];
和:
[self displayOneLife];
根据情况使用其中一种更好吗?如果是这样,有人可以为我详细说明吗?我只想使用 Objective-C 最佳实践。
谢谢你,乔伊
我可以通过执行以下操作在我的应用程序中完成相同的任务:
[self performSelector:@selector(displayOneLife)];
和:
[self displayOneLife];
根据情况使用其中一种更好吗?如果是这样,有人可以为我详细说明吗?我只想使用 Objective-C 最佳实践。
谢谢你,乔伊
-performSelector 方法通常用于您想调用一些在编译时未知的选择器。例如,当用户点击它时,UIButton 使用它来调用连接到它的操作(按钮知道它在 IB 中连接的方法的名称以及它连接到的类)。
对于所有其他情况,您应该使用后者,因为您不想将代码转换为无法阅读的谜题。
PS -performSelector + 动态选择器名称构造可用于解决 Apple 的静态分析器,该分析器在二进制文件中寻找被禁止的调用:)
@selector 有一个非常特殊的用途,你不应该用它来调用已知的方法。
您使用@selector 通知其他类您应该调用的方法之一。
例如,您可以将类 countNumber 一个选择器传递给您的方法 @selector(result:) 以便其他类在完成其任务时调用您的方法。
示例代码:
- (void)calculateANumber
{
[NumbersClass countNumber:myNumber withResult:@selector(result:)];
}
//This method will get called by NumbersClass, even tho it didnt know its existence before
- (void)result:(int)countResult
{
myResult = countResult;
}
只是一个例子,显然,它什么都不做
您可以将选择器存储在变量中,这performSelector:
对于在编译时不知道要发送什么消息时很有用。例如,目标-动作系统是基于选择器的。这是控件的基本实现:
@interface FakeControl : NSObject
@property(nonatomic, strong) id target;
@property(nonatomic, assign) SEL action;
- (void)click;
@end
@implementation FakeControl
- (void)click {
[target performSelector:action];
}
@end
通过使用选择器,我们可以让控件在运行时在单击时发送我们想要的任何消息。
如果你必须内联做一些事情,尤其是在同一个线程上
[self displayOneLife]
足够好
但是有很多情况下,您想在另一个线程上执行,或者在延迟之后等。如果您只是键入,[self perform ...],您会看到很多关于 performSelector 可用方法的建议,每个方法签名将帮助您了解它的作用。
选择其中一种方法,只需命令单击方法名称即可。它将向您显示有关该方法的作用等的详细信息。
这是一个很好的问题,但有很多答案。运行循环、线程、延迟、异步操作都是原因。