10

Conosco la possibilità di dichiarare proprietà private su una classe inserendole all'interno di una categoria senza nome su quella classe dichiarata nel file di implementazione (.m) di quella classe. Quello è non quello che voglio fare.Come posso dichiarare una proprietà privata all'interno di una categoria nominata?

Ho a che fare con una categoria denominata in una classe che aggiunge alcune funzionalità a quella classe. Per questa funzionalità, mi sarebbe di grande aiuto avere una proprietà privata da usare nella mia categoria, quindi il solito modo di ottenerlo (descritto sopra) non sembra funzionare per me. O lo fa? Per favore, illuminami!

risposta

22

All'interno del file di implementazione della categoria, dichiarare un'altra categoria e chiamarla come MyCategoryName_Private e dichiarare le proprietà private lì. Fornire implementazioni dei metodi -propertyName e -setPropertyName: utilizzando oggetti associati.

Ad esempio, il file di implementazione potrebbe essere simile a questo:

#import "SomeClass+MyCategory.h" 
#import <objc/runtime.h> 

@interface SomeClass (MyCategory_Private) 

@property (nonatomic, strong) id somePrivateProperty; 

@end 

@implementation SomeClass (MyCategory_Private) 

static void *AssociationKey; 

- (id)somePrivateProperty 
{ 
    return objc_getAssociatedObject(self, AssociationKey); 
} 

- (void)setSomePrivateProperty:(id)arg 
{ 
    objc_setAssociatedObject(self, AssociationKey, arg, OBJC_ASSOCIATION_RETAIN); 
} 

@end 

@implementation SomeClass (MyCategory) 

// implement your publicly declared category methods 

@end 
+1

Yahey, vi ringrazio molto! Questo è esattamente quello che stavo cercando! Forse alcune persone considererebbero questo non la migliore pratica di codifica, inserendo una categoria interamente in un file 'm', ma in ogni caso questo risolve il mio problema e rende le cose molto più facili per me :) –

+1

Beautiful. Grazie! – theDuncs

+0

Penso che dovrei creare più AssociationKeys se voglio avere più proprietà private? – allenlinli