クラスのプライベートプロパティにアクセスしたいと思います。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
私は、 '.mのみで' ClassA + Private.h'をインポートするほうがよいでしょう。 'ClassA.h'に' ClassA + Private.h'を置くと、その目的を破る 'ClassA.h'をインポートするすべてのクラスにプロパティが見えるようになります。 –
また、 'ClassA + Protected.h'は' ClassA + Private.h'よりも正確です。 –
1と合意し、答えを編集しました。保護されていると、私はこれが目を滲ませることに同意しますが、他のプログラミング言語から来ていない人々にとってはこれはおそらく何の違いもないので、私はちょうど質問の著者が提案した命名を使用しました。 – lawicko