realizar selector o directamente

Entiendo que estos dos son poco similares, pero debe haber alguna diferencia interna entre dos,

[anObject performSelector:@selector(thisMethod:) withObject:passedObject]; 

es equivalente a:

 [anObject thisMethod:passedObject]; 

Por favor, dime cuál es la diferencia en términos de compilation, memory, etc.

La familia de methods performSelector es para casos especiales, la gran mayoría de las invocaciones de método en Obj-C deberían ser directas. Algunas diferencias:

Indirecto: cuando se utiliza performSelector para invocar un método, tiene dos invocaciones de método; el de performSelector y el método de destino.

Los arguments son objects: al invocar a través de performSelector todos los arguments se deben pasar como objects, por ejemplo, si se invoca un método que toma un valor double , ese valor debe envolverse como un número NSNumber antes de pasar a performSelector . Los methods performSelector desenvuelven los arguments que no son object antes de llamar al método de destino. En la invocación directa no se requiere envolver o desenvolver.

Solo dos arguments: la familia performSelector solo incluye variantes que performSelector arguments 0, 1 o 2, por lo que no puede usarlos para invocar un método que tenga 3 o más arguments.

Probablemente vea la mayoría de los anteriores como negativos, entonces, ¿cuáles son los beneficios?

Selector dynamic: la familia performSelector permite invocar un método que no se conoce hasta el time de ejecución, solo se debe conocer su tipo (para que pueda pasar los arguments correctos y get el resultado correcto); En otras palabras, el argumento selector puede ser una expresión de tipo SEL . Esto podría usarse cuando desee pasar un método como argumento a otro método e invocarlo. Sin embargo, si está comstackndo con ARC utilizando selectores dynamics no es trivial y generalmente produce advertencias del comstackdor, ya que sin saber el selector ARC no puede conocer los attributes de propiedad de los arguments.

Ejecución retrasada: la familia performSelector incluye methods que invocan el método después de un retraso.

En general, use invocación de método directo, solo si eso no le da lo que necesita, debe considerar la familia performSelector (o sus primos aún más esotéricos).

performSelector:withObject: será un poco más lento que llamar directamente al método. La indirección también significa que el comstackdor no puede realizar la verificación de tipo adecuada. Con ARC habilitado, también se encontrará con problemas en los que el comstackdor se quejará porque es imposible determinar exactamente cuál podría ser la política de administración de memory.

En general, dicha indirección, a menudo llamada reflexión, pero con mayor precisión se conoce como metaprogtwigción, debe evitarse exactamente porque mueve lo que deberían comstackr fallos detectables en el time a fallas en time de ejecución.

Tal dinamismo solo es necesario cuando no se puede determinar el nombre del selector, el nombre del método, en el momento de compilation . No debe utilizarse para los methods @optional en los protocolos ni debe usarse durante la delegación (en ambos casos, respondsToSelector: un @optional respondsToSelector: + una llamada de método directo es un patrón mucho mejor para emplear).

El método performSelector: permite enviar posts que no están determinados hasta el time de ejecución. Para más información lee esto.

Si su aplicación quiere hacer uso de la reflection , en qué lugar al cambiar algunos valores en el file de configuration, desea invocar un método diferente (Diferentes adaptadores). O basado en el tipo de object, le gustaría invocar un método diferente en time de ejecución.

Si desarrolla un producto personalizable, esta es una característica poderosa.

Me gusta usar [id performSelecter: selector withObject] cuando declara e implementa un protocolo personalizado y delegar patrón, también es un caso de uso, donde deberíamos usar performselector en lugar de llamar directamente al método …