Pour diverses raisons, j'ai besoin d'associer un format numérique par défaut (un NSNumberFormatter
) à des objets NSNumber
. Je veux soutenir ce même pour les objets créés en dehors de mon contrôle, donc plutôt que de créer une sous-classe de NSNumber, je l'ai utilisé une catégorie et la ObjC associated object functionality pour y parvenir: Comment créer une catégorie avec une propriété pour les objets NSNumber
@interface NSNumber (defaultNumberFormat)
@property (nonatomic,strong) NSNumberFormatter *defaultNumberFormat;
@end
@implementation NSNumber (defaultNumberFormat)
@dynamic defaultNumberFormat;
- (void)setDefaultNumberFormat:(NSNumberFormatter *)format {
[self willChangeValueForKey:@"defaultNumberFormat"];
objc_setAssociatedObject(self, @selector(defaultNumberFormat), format, OBJC_ASSOCIATION_COPY_NONATOMIC);
[self didChangeValueForKey:@"defaultNumberFormat"];
}
- (NSNumberFormatter *)defaultNumberFormat {
return objc_getAssociatedObject(self, @selector(defaultNumberFormat));
}
@end
Cela fonctionne bien sous 32 Compilation de bits, cependant sous iOS7 pour les cibles 64 bits, pour certaines valeurs, il se bloque avec EXC_BAD_ACCESS (code = EXC_I386_GPFLT) à l'appel obj_setAssociatedObject
. Il s'avère que la raison est iOS utilise des pointeurs étiquetés pour les cibles 64 bits pour les objets sélectionnés avec de petites valeurs pour améliorer les performances (évite le besoin d'allocation de mémoire et de nettoyage ARC pour l'objet). Cela inclut certaines valeurs NSString, NSNumber et NSDate. Voir plus d'informations here et here.
Alors, comment obtenez-vous une catégorie avec une propriété pour NSNumber en mode 64 bits?