2012-07-19 14 views
11

Desidero accedere alla proprietà privata di una classe dalla sua categoria.in Objective-C, come accedere alla proprietà privata dalla categoria

Ma per accedere alla proprietà privata, devo ridichiarare la stessa proprietà privata nella categoria.
Se non redeclare, ottengo un errore di compilazione, Property '<property name>' not found on object of type '<class name> *'.

Questo modo corretto di accedere alla proprietà privata della classe dalla categoria?
E ci sono modi migliori per farlo?

Il codice seguente è il codice che la proprietà privata è ridichiarato nella categoria:

ClassA.h

@interface ClassA : NSObject 
-(void)method1; 
@end 

ClassA.m

#import "ClassA.h" 

// private property 
@interface ClassA() 
@property (nonatomic) NSString *s; 
@end 

@implementation ClassA 
@synthesize s; 

-(void)method1 
{ 
    self.s = @"a"; 
    NSLog(@"%@", [NSString stringWithFormat:@"%@ - method1", self.s]); 
} 
@end 

ClasseA + Category.h

#import "ClassA.h" 

@interface ClassA(Category) 
-(void)method2; 
@end 

ClasseA + Category.m

#import "ClassA+Category.h" 

// redeclare private property 
@interface ClassA() 
@property(nonatomic) NSString *s; 
@end 

@implementation ClassA(Category) 

-(void)method2 
{ 
    NSLog(@"%@", [NSString stringWithFormat:@"%@ - method2", self.s]); 
} 
@end 


Is è buon modo per creare un file (ClassA + Private.m) per la proprietà privata e importarlo da ClassA.m e ClasseA + Category.m:

ClasseA + Private.m

@interface ClassA() 
@property(nonatomic) NSString *s; 
@end 

risposta

10

Il modo migliore per risolvere questo è quello di creare ClassA+Private.h e importarlo in ClassA.m e Category.m. Attenta allo h alla fine, devi solo dichiarare le tue proprietà e metodi privati ​​lì, la definizione è meglio conservata in ClassA.m.

+3

Direi che sarebbe meglio importare 'ClassA + Private.h' solo nel file' .m'. L'inserimento di 'ClassA + Private.h' in' ClassA.h' rende le proprietà visibili a tutte le classi che importano 'ClassA.h', che sconfigge lo scopo. –

+0

Inoltre, penso che 'ClassA + Protected.h' sia più preciso di' ClassA + Private.h'. –

+0

Concordato con 1 e modificato la risposta. Per quanto riguarda la protezione, sono d'accordo che questo fa sanguinare gli occhi, ma per le persone che non provengono da altri linguaggi di programmazione questo probabilmente non fa alcuna differenza, quindi ho semplicemente usato la denominazione suggerita dall'autore della domanda. – lawicko

Problemi correlati