¿Hay alguna manera de llamar a [anObject performSelector]; con más de 2 objetos? Sé que puede usar una matriz para pasar argumentos múltiples, pero me preguntaba si había una forma de nivel inferior para llamar a una función que ya he definido con más de 2 argumentos sin usar una función auxiliar con un nsarray de argumentos.performSelector con más de 2 objetos
Respuesta
Cualquiera (1) Utilice un NSInvocation o (2) use directamente objc_msgSend
.
objc_msgSend(target, @selector(action:::), arg1, arg2, arg3);
(Nota: asegúrese de todos los argumentos son id
's, de lo contrario los argumentos no podrían ser enviados correctamente.)
Usted puede extender la clase NSObject
así:
- (id) performSelector: (SEL) selector withObject: (id) p1
withObject: (id) p2 withObject: (id) p3
{
NSMethodSignature *sig = [self methodSignatureForSelector:selector];
if (!sig)
return nil;
NSInvocation* invo = [NSInvocation invocationWithMethodSignature:sig];
[invo setTarget:self];
[invo setSelector:selector];
[invo setArgument:&p1 atIndex:2];
[invo setArgument:&p2 atIndex:3];
[invo setArgument:&p3 atIndex:4];
[invo invoke];
if (sig.methodReturnLength) {
id anObject;
[invo getReturnValue:&anObject];
return anObject;
}
return nil;
}
(Consulte NSObjectAdditions del proyecto Three20.) Entonces, incluso podría extender el método anterior para usar varargs y una matriz de argumentos sin terminación, pero eso es exagerado.
Una opción adicional, cuando necesita enviar múltiples objetos con performSelector
es (si es fácil hacerlo) modificar el método que desea llamar para tomar un objeto NSDictionary
en lugar de varios parámetros, ya que podrá para enviar tantas como quieras dentro del diccionario.
Por ejemplo
que tenían un método similar a este que tenía 3 argumentos y que tenía que llamarlo desde performSelector -
-(void)getAllDetailsForObjectId:(NSString*)objId segment:(Segment*)segment inContext:(NSManagedObjectContext*)context{
me cambió este método para hacer uso de un diccionario para almacenar el argumentos
-(void)getAllDetailsForObject:(NSDictionary*)details{
por lo tanto, yo era capaz de llamar al método fácilmente
[self performSelector:@selector(getAllDetailsForObject:) withObject:@{Your info stored within a dictionary}];
Pensé que sería mejor compartir esto como una opción alternativa, ya que funciona para mí.
Saludos
- 1. Agregar 2 o más objetos a JFrame
- 2. equivalente de Java de [self performSelector: foo afterDelay: 2]
- 3. Comparar 2 JSON objetos
- 4. PerformSelector advertencia
- 5. Uso de performSelector: withObject: afterDelay: con parámetros que no son objetos
- 6. Comparando 2 objetos personalizados - C#
- 7. PerformSelector Monotouch Threading
- 8. SEL performSelector and arguments
- 9. performselector no afterdelay trabajo
- 10. performSelector ARC advertencia
- 11. Detener un performSelector: de realizarse
- 12. scheduledTimerWithTimeInterval vs performselector con retraso con iOS 5.0
- 13. archivos de asignación más grandes de 2 GB con Java
- 14. Las estructuras u objetos en Powershell 2
- 15. Objetos de tiempo de Python con más de 24 horas
- 16. cancelando performSelector de cola: llamadas afterDelay
- 17. ¿Más objetos en la memoria con la misma identificación?
- 18. ¿Cómo se puede usar Path.Combine con más de 2 argumentos?
- 19. ¿Cómo hacer IZQUIERDA unir con más de 2 tablas?
- 20. cancelPreviousPerformRequestWithTarget no cancela mi thread previamente retrasado iniciado con performSelector
- 21. ¿Hay objetos Func con más de 4 parámetros?
- 22. tratando de conseguir más simple ejemplo posible de performSelector: withObject trabajo
- 23. Bloqueo en objc_retain en el método realizado con performSelector
- 24. Ordenar NSmutableArray que contiene 2 tipos de objetos?
- 25. ¿Cómo implementar métodos idénticos con 2 y más clases?
- 26. tratando de pasar a CGRect performSelector withObject
- 27. performSelector: withObject: y su comportamiento de retención
- 28. Bloques en lugar de performSelector: withObject: afterDelay:
- 29. performSelector: withObject: afterDelay: no funciona desde scrollViewDidZoom
- 30. ¿Cómo puedo eliminar todo performSelector: withObject: afterDelay :?
Al utilizar objc_msgSend, tendrá que import según: http://stackoverflow.com/questions/4896510/how-to-import-nsobjcruntime-h -to-use-objc-msgsend –
esa última nota que hiciste para asegurarte de que todos los argumentos sean del tipo id ... ¿puedes seguir explicando? o proporcionar algún recurso, por favor? no puedo encontrar ninguno. –