¿Es posible tener una categoría Objective-C que solo se carga si el método aún no existe?

En un proyecto anterior (pre-iOS 4.0), escribí el siguiente método de categoría en NSSortDescriptor :

 + (id)sortDescriptorWithKey:(NSString *)key ascending:(BOOL)ascending; 

Cuando Apple lanzó iOS SDK 4.0, incluyó exactamente el mismo método (que presumiblemente hace exactamente lo mismo). ¿Es posible escribir una categoría que solo se agregue al time de ejecución, ya sea si está ejecutando una versión particular del sistema operativo, o probablemente más al punto, si no hay un método declarado con la misma firma?

En este caso, probablemente sea seguro anular el sortDescriptorWithKey:ascending: con una categoría, que proporcionará compatibilidad con iOS 3 y iOS 4, ya que mi versión casi con certeza hará lo mismo. Aún así, prefiero no meterme con methods definidos por el sistema si es posible, debido a la (improbable) posibilidad de romper cosas en casos extremos.

No directamente, no.

La forma en que recomiendo hacer esto sería tener un my_sortDescriptorWithKey: que luego puede verificar si la class responde a sortDescriptorWithKey: y lo usa si lo hace, de lo contrario usar su propia implementación.

La respuesta de Joshua funcionará bien, pero si quieres ser realmente elegante, puedes usar la naturaleza dinámica de Objective-C para modificar la class NSSortDescriptor a tu gusto:

 #import <objc/runtime.h> SEL theSelector = @selector(sortDescriptorWithKey:ascending:); if ( ! [NSSortDescriptor instancesRespondToSelector:theSelector]) { class_addMethod([NSSortDescriptor class], theSelector, (IMP)mySortDescriptorWithKey, "@@:@B"); } 

Por supuesto, eso depende de una function C:

 id mySortDescriptorWithKeyAscending(id self, SEL _cmd, NSString *key, BOOL ascending) { // Put your code here. } 

DESCARGO DE RESPONSABILIDAD: No he intentado comstackr nada de esto.

DESCARGO DE RESPONSABILIDAD II: Apple puede desaprobarlo en términos de presentación de App Store.