2011-06-15 6 views
7
+(BOOL)resolveClassMethod:(SEL)aSel { 
    NSString *lString = NSStringFromSelector(aSel); 

    if ([self validateLetterAndAccidental:lString]) { 

     id (^noteFactoryBLOCK)(id) = ^(id aSelf) { 
      return [self noteWithString:lString]; 
     }; 

     IMP lIMP = imp_implementationWithBlock(noteFactoryBLOCK); 
     ... 

Aparece un error en la última línea porque noteFactoryBLOCK se convierte en un vacío * y ARC no permite eso. ¿Hay actualmente una manera de lograr lo que quiero? Me gustaría un IMP que pueda pasar a class_addMethod en tiempo de ejecución.lanzando un bloque a un vacío * para resolución de método de clase dinámica

EDITAR

IMP myIMP = imp_implementationWithBlock(objc_unretainedPointer(noteFactoryBLOCK)); 

Esta línea darme una advertencia en lugar de un error - Semantic Issue: Passing 'objc_objectptr_t' (aka 'const void *') to parameter of type 'void *' discards qualifiers

+0

ARC is public now! Ver http://lists.cs.uiuc.edu/pipermail/cfe-dev/2011-June/015588.html –

Respuesta

2

Odio decirlo, pero que sólo podría tener que desechar la const en este caso.

IMP myIMP = imp_implementationWithBlock((void*)objc_unretainedPointer(noteFactoryBLOCK));

Eso es bastante feo sin embargo.

+0

feo de hecho. Ni siquiera había considerado la opción porque pensé que de alguna manera no era una opción. – griotspeak

Cuestiones relacionadas