16

我想从其类别中访问一个类的私有属性。

但是要访问私有财产,我必须在类别中重新声明相同的私有财产。
如果我不重新声明,我会收到一个编译错误,Property '<property name>' not found on object of type '<class name> *'.

这是从类别访问类私有属性的正确方法吗?
有没有更好的方法来做到这一点?

以下代码是在类别中重新声明私有属性的代码:

类A.h

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

类A.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 回答