16

カテゴリからクラスのプライベート プロパティにアクセスしたい。

しかし、プライベート プロパティにアクセスするには、同じプライベート プロパティをカテゴリで再宣言する必要があります。
再宣言しないと、コンパイル エラーが発生します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
4

1 に答える 1

12

これを解決する最善の方法は、 と で作成しClassA+Private.hてインポートすることです。最後に注意してください。ここでプライベート プロパティとメソッドを宣言するだけで済みます。定義は.ClassA.mCategory.mhClassA.m

于 2012-07-19T09:09:43.233 に答える