2012-07-19 10 views
11

クラスのプライベートプロパティにアクセスしたいと思います。Objective-Cで、プライベートプロパティにアクセスする方法

しかし、プライベートプロパティにアクセスするには、カテゴリに同じプライベートプロパティを再宣言する必要があります。
再宣言しなければ、コンパイルエラー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.hを作成し、ClassA.mCategory.mでそれをインポートすることです。末尾にhがあることを覚えておいてください。プライベートプロパティとメソッドを宣言するだけで、定義はClassA.mの方がよいでしょう。

+3

私は、 '.mのみで' ClassA + Private.h'をインポートするほうがよいでしょう。 'ClassA.h'に' ClassA + Private.h'を置くと、その目的を破る 'ClassA.h'をインポートするすべてのクラスにプロパティが見えるようになります。 –

+0

また、 'ClassA + Protected.h'は' ClassA + Private.h'よりも正確です。 –

+0

1と合意し、答えを編集しました。保護されていると、私はこれが目を滲ませることに同意しますが、他のプログラミング言語から来ていない人々にとってはこれはおそらく何の違いもないので、私はちょうど質問の著者が提案した命名を使用しました。 – lawicko

関連する問題