问题 在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

3909
2017-07-19 07:45


起源



答案:


解决这个问题的最佳方法是创建 ClassA+Private.h 并导入它 ClassA.m 和 Category.m。记住 h 最后,你只需要在那里声明你的私有属性和方法,最好保留定义 ClassA.m


10
2017-07-19 09:09



我想说进口会更好 ClassA+Private.h 在里面 .m 只要。配售 ClassA+Private.h 在 ClassA.h 使属性对导入的所有类都可见 ClassA.h 这违背了目的。 - Benedict Cohen
另外,我想 ClassA+Protected.h 会更准确 ClassA+Private.h。 - Benedict Cohen
同意1并编辑答案。至于受保护,我同意这会让眼睛流血,但对于那些不是来自其他编程语言的人来说,这可能没有任何区别,所以我只是使用了问题作者提出的命名。 - lawicko
它认为已经过了一段时间,并且公平地说“私人”现在更像是一个惯例。 - fatuhoku
@lawicko ClassA + Private.h在一个单独的文件中? - The iCoder


答案:


解决这个问题的最佳方法是创建 ClassA+Private.h 并导入它 ClassA.m 和 Category.m。记住 h 最后,你只需要在那里声明你的私有属性和方法,最好保留定义 ClassA.m


10
2017-07-19 09:09



我想说进口会更好 ClassA+Private.h 在里面 .m 只要。配售 ClassA+Private.h 在 ClassA.h 使属性对导入的所有类都可见 ClassA.h 这违背了目的。 - Benedict Cohen
另外,我想 ClassA+Protected.h 会更准确 ClassA+Private.h。 - Benedict Cohen
同意1并编辑答案。至于受保护,我同意这会让眼睛流血,但对于那些不是来自其他编程语言的人来说,这可能没有任何区别,所以我只是使用了问题作者提出的命名。 - lawicko
它认为已经过了一段时间,并且公平地说“私人”现在更像是一个惯例。 - fatuhoku
@lawicko ClassA + Private.h在一个单独的文件中? - The iCoder