¿Puede un UIAlertView pasar una cadena y un int mediante un delegado?

Tengo un UIAlertView (varios, de hecho), y estoy usando el método -(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex para activar una acción si el usuario no presiona cancelar. Aquí está mi código:

 - (void)doStuff { // complicated time consuming code here to produce: NSString *mySecretString = [self complicatedRoutine]; int myInt = [self otherComplicatedRoutine]; UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"HERE'S THE STUFF" message:myPublicString // derived from mySecretString delegate:nil cancelButtonTitle:@"Cancel" otherButtonTitles:@"Go On", nil]; [alert setTag:3]; [alert show]; [alert release]; } 

y luego lo que me gustaría hacer sería lo siguiente:

 - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { if (buttonIndex == 1) { if ([alertView tag] == 3) { NSLog(@"%d: %@",myInt,mySecretString); } } } 

Sin embargo, este método no sabe sobre mySecretString o myInt . Definitivamente no quiero volver a calcularlos, y no quiero almacenarlos como properties ya que -(void)doStuff rara vez, o nunca, se llama. ¿Hay alguna forma de agregar esta información adicional a UIAlertView para evitar volver a calcular o almacenar mySecretString y myInt ?

¡Gracias!

Probablemente la forma más rápida de asociar un object con un object arbitrario es usar objc_setAssociatedObject . Para usarlo correctamente, necesita un void * arbitrario para usar como key; la forma habitual de hacerlo es declarar globalmente una static char fooKey en su file .m y usar &fooKey como la key.

 objc_setAssociatedObject(alertView, &secretStringKey, mySecretString, OBJC_ASSOCIATION_RETAIN); objc_setAssociatedObject(alertView, &intKey, [NSNumber numberWithInt:myInt], OBJC_ASSOCIATION_RETAIN); 

Luego usa objc_getAssociatedObject para recuperar los objects más tarde.

 NSString *mySecretString = objc_getAssociatedObject(alertView, &secretStringKey); int myInt = [objc_getAssociatedObject(alertView, &intKey) intValue]; 

Al usar OBJC_ASSOCIATION_RETAIN, los valores se mantendrán mientras se adjuntan a la vista de alertView y luego se liberarán automáticamente cuando se desasigne.