2009-07-23 6 views

Respuesta

5

Uso NSValue para envolver el selector: solución

// Set selector 
SEL inSelector = @selector(something:); 
NSValue *selectorAsValue = [NSValue valueWithBytes:&inSelector objCType:@encode(SEL)]; 
id dict = [[NSMutableDictionary alloc] initWithObjectsAndKeys:@"some text", @"text", selectorAsValue, @"selector", nil]; 

// Retrieve selector 
SEL outSelector; 
[(NSValue *)[dict objectForKey:@"selector"] getValue:&outSelector]; 
// Now outSelector can be used as a selector, e.g. [self performSelector:outSelector] 
+3

Como seguimiento, NSValue es la clase correcta para envolver cualquier tipo de objeto en un objeto. NSPoint, NSRect y NSSize tienen constructores dedicados y los tipos de número están envueltos por la subclase NSNumber, pero también puede envolver estructuras arbitrarias e incluso ajustar objetos sin conservarlos. Aunque tenga en cuenta ... NSValue es para * datos * tipados. Los bloques arbitrarios de datos binarios deben ser envueltos por NSData. –

+1

Esto pide una categoría en NSValue – cfischer

15

de pix0r es bueno, pero por lo general prefieren utilizar cadenas porque son más resistentes a la serialización y hacer que el diccionario más fácil de leer en la depuración salida.

// Set selector 
SEL inSelector = @selector(something:); 
NSString *selectorAsString = NSStringFromSelector(inSelector); 
id dict = [[NSMutableDictionary alloc] initWithObjectsAndKeys:@"some text", @"text", selectorAsString, @"selector", nil]; 

// Retrieve selector 
SEL outSelector = NSSelectorFromString([dict objectForKey:@"selector"]); 
+0

Estoy de acuerdo con esto. SEL se asigna de forma más natural a una cadena (ya que es un nombre) que a un valor (que normalmente representa escalares C y estructuras). – Chuck

+0

Además, podría enviar un string desde un servicio si está dispuesto a jugar juegos arriesgados como ese. –

Cuestiones relacionadas