2012-07-19 36 views
11

我想訪問類別的私有財產。,如何從類別訪問私有財產

但要訪問私有財產,我必須重新聲明類別中的同一私有財產。
如果我不重新聲明,我得到一個編譯錯誤,Property '<property name>' not found on object of type '<class name> *'

這是從類別訪問類的私有財產的正確方法嗎?
有沒有更好的方法來做到這一點?

以下代碼是私有屬性在類別重新聲明的代碼:

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 

ClassA的+ Category.h

#import "ClassA.h" 

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

ClassA的+ 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 


是是創建私有財產文件(ClassA的+ Private.m)和ClassA.m和ClassA的+ Category.m導入好辦法:

ClassA的+ Private.m

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

回答

10

來解決它的最好方法是創建ClassA+Private.hClassA.mCategory.m導入。注意h最後,你只需要聲明你的私有屬性和方法,定義最好保存在ClassA.m

+3

我想說只在'.m'中導入'ClassA + Private.h'會更好。在'ClassA.h'中放置'ClassA + Private.h'使得所有導入'ClassA.h'的類都可以看到這些屬性,這些都違背了目的。 – 2012-07-19 09:33:05

+0

另外,我認爲'ClassA + Protected.h'會比'ClassA + Private.h'更準確。 – 2012-07-19 09:33:59

+0

同意1並編輯答案。至於保護,我同意這會讓眼睛流血,但對於不是來自其他編程語言的人,這可能沒有什麼區別,所以我只是使用了問題作者所提出的命名。 – lawicko 2012-07-19 09:59:54