Cómo resolver "ningún método de instancia conocido para selector" performSelector: withObject: afterDelay: '"al migrar a ARC?

La herramienta de migration de ARC se niega a aceptar este código antes de comenzar con la migration:

[self.delegate performSelector:@selector(overlayDismissed:) withObject:self afterDelay:0]; 

El delegado se ve obligado a implementar este método con un protocolo, y debería funcionar bien:

 @protocol OverlayDelegate <NSObject> - (void)overlayDismissed:(Overlay*)overlay; @end @interface Overlay : UIImageView { id<OverlayDelegate> delegate; } @property (nonatomic, assign) id<OverlayDelegate> delegate; 

¿Qué pasa con ARC? ¿Por qué me dice que no hay "método de instancia conocido para el selector" performSelector: withObject: afterDelay: '?

ARC no está causando esto, simplemente lo está exponiendo. Ese método se define en NSObject, pero el id funciona para algo más que NSObject (por lo que debe ser más específico que simplemente "id"). Cambia tu código a esto:

 @interface Overlay : UIImageView { NSObject<OverlayDelegate> *delegate; } @property (nonatomic, assign) NSObject<OverlayDelegate> *delegate; 

Simple, su object es de tipo id y se ajusta al protocolo NSObject . Sin embargo, este protocolo no declara performSelector:withObject:afterDelay: por lo que ARC no sabe qué está haciendo el método y si debe conservar algo. Utilice un object NSO o envíelo antes de realizar la llamada al método.

Me di count de que lanzar el delegado a NSObject * resuelve el problema:

 [self.delegate performSelector:@selector(overlayDismissed:) withObject:self afterDelay:0]; 

Por alguna extraña razón, el autocompletado ni siquiera apareció con -performSelector:withObject:afterDelay: así que tuve que escribirlo manualmente. En cambio, solo ofrecía -performSelector: y -performSelector:withObject:withObject:

Mi conjetura es que es estúpido usar id como el tipo de delegado en Objective-C, y nunca supe por qué todos, incluido yo, lo estamos haciendo en lugar de simplemente definirlo como NSObject. Sin embargo, mi protocolo incluso dijo que quien se atiene a ese protocolo también tiene que ajustarse al protocolo NSObject haciendo esto: OverlayDelegate <NSObject> – y aún así, el comstackdor no lo obtuvo.

Así que por ahora estoy satisfecho de que funciona con el elenco, pero se siente como comer pescado viejo.

Me encontré con error:

Ningún método de class conocido para selector conformaToProtocol:

La razón es que: el nombre del file no es igual al nombre de la class con @interface y @implementation .