有人能告诉我IOS中的电话之间的区别

时间:2011-11-17 07:51:28

标签: iphone objective-c ios

我有一个名为Display的方法。有人可以通过以下两种方式向我解释调用相同方法的区别。

  1. [self Display];
  2. [self performselector:@selector(Display)]
  3. - (void)Display { NSlog(@"Data"); }

6 个答案:

答案 0 :(得分:2)

两者基本相同,只有一分钟差异。@ select赋予您的方法名称,您可以将其作为属性传递给其他对象或其他函数调用。 就像你想要将消息发送到其他对象并且想要将显示作为属性发送一样,那么你将不得不使用@selector给它一个名字,因此你可以发送它...它是一个非常模糊的概念..希望这有助于

并引用苹果文件......

  

“但是,performSelector:方法允许您发送消息   直到运行时才确定。变量选择器可以作为传递   论证:

     

SEL myMethod = findTheAppropriateSelectorForTheCurrentSituation();

     

[anObject performSelector:myMethod];

     

aSelector参数应该标识一个不需要的方法   参数。对于返回除对象以外的任何内容的方法,请使用   NSInvocation的“。

答案 1 :(得分:1)

  1. [self Display]更短,更易于阅读,书写和理解。

  2. [self performSelector:@selector(Display)]可以执行任意选择器。如果将选择器保存在变量中,则可以在以后执行它而不知道调用的方法。因此它更灵活。更好的是:您可以将选择器和对象传递给其他对象,并在必要时让它们为您调用它。您想要使用它的一个示例是NSUndoManager,如果用户执行撤消命令,它会调用选择器撤消操作。

答案 2 :(得分:0)

我不认为您提供的示例之间存在很大差异,但是当您例如想要将方法的执行移动到后台线程时,执行选择器非常有用。

答案 3 :(得分:0)

[self Display]; 是对已知对象的已知方法的调用。
如果你想要的话,很容易给它一些参数:[self DisplayWithParam1:(NSString*)aString param2:(int)aNumber param3:(NSDictionary*)aDict

[self performselector:@selector(Display)] 是一个电话,允许您在可能未知的对象类型上调用可能未知的方法。

让我们假设您有许多类都响应给定的协议,需要实现Display方法。你在NSMutableArray中放了一些不同类的对象。稍后解析数组时,您将获得id个类型的对象。

因此调用[myArrayObject Display];将在运行时工作,但会在编译时生成警告,因为id当然不支持任何方法,即使您知道此对象支持该方法。
为防止发出警告,请致电[myArrayObject performselector:@selector(Display)]; 该调用的问题是难以传递某些参数

答案 4 :(得分:0)

    performSelector:withObject:withObject:

Sends a message to the receiver with two objects as arguments. 
- (id)performSelector:(SEL)aSelector withObject:(id)anObject withObject:(id)anotherObject
Parameters

aSelector

    A selector identifying the message to send. If aSelector is NULL, an NSInvalidArgumentException is raised.
anObject

    An object that is the first argument of the message.
anotherObject

    An object that is the second argument of the message

Return Value

An object that is the result of the message.
Discussion

This method is the same as performSelector: except that you can supply two arguments for aSelector. aSelector should identify a method that can take two arguments of type id. For methods with other argument types and return values, use NSInvocation.
Availability

    Available in Mac OS X v10.0 and later.

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocSelectors.html

答案 5 :(得分:-2)

@select调用更快。通常,您在Objective-C中拥有的代码(并且动态性较小)运行得越快。在这里,the selector call bypasses the usual callobjc_msgSend()

如果可以避免,我建议不要写这样的代码。选择器在Cocoa中有点常见,但是如果你使用它来加速它真的不值得。 objc_msgSend()经过高度优化且速度非常快。