1

可能重复:
使用 -performSelector: 与仅调用方法

我可以通过执行以下操作在我的应用程序中完成相同的任务:

[self performSelector:@selector(displayOneLife)];

和:

[self displayOneLife];

根据情况使用其中一种更好吗?如果是这样,有人可以为我详细说明吗?我只想使用 Objective-C 最佳实践。

谢谢你,乔伊

4

4 回答 4

3

-performSelector 方法通常用于您想调用一些在编译时未知的选择器。例如,当用户点击它时,UIButton 使用它来调用连接到它的操作(按钮知道它在 IB 中连接的方法的名称以及它连接到的类)。

对于所有其他情况,您应该使用后者,因为您不想将代码转换为无法阅读的谜题。

PS -performSelector + 动态选择器名称构造可用于解决 Apple 的静态分析器,该分析器在二进制文件中寻找被禁止的调用:)

于 2012-11-09T18:20:01.260 回答
2

@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;
}

只是一个例子,显然,它什么都不做

于 2012-11-09T18:20:45.843 回答
2

您可以将选择器存储在变量中,这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

通过使用选择器,我们可以让控件在运行时在单击时发送我们想要的任何消息。

于 2012-11-09T18:21:14.360 回答
0

如果你必须内联做一些事情,尤其是在同一个线程上

[self displayOneLife] 

足够好

但是有很多情况下,您想在另一个线程上执行,或者在延迟之后等。如果您只是键入,[self perform ...],您会看到很多关于 performSelector 可用方法的建议,每个方法签名将帮助您了解它的作用。

选择其中一种方法,只需命令单击方法名称即可。它将向您显示有关该方法的作用等的详细信息。

这是一个很好的问题,但有很多答案。运行循环、线程、延迟、异步操作都是原因。

于 2012-11-09T18:20:27.907 回答