在Objective-C中,如何从类别访问私有财产

js_*_*js_ 12 iphone objective-c ios

我想从其类别访问类的私有属性.

但是要获得私人财产,我必须重新申请同一个私人财产.
如果我不重新声明,我会收到编译错误Property '<property name>' not found on object of type '<class name> *'.

这是从类别访问类的私有属性的正确方法吗?
还有更好的方法吗?

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

ClassA.h

@interface ClassA : NSObject
-(void)method1;
@end
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

ClassA的+ Category.h

#import "ClassA.h"

@interface ClassA(Category)
-(void)method2;
@end
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)


是为私有属性创建文件(ClassA + Private.m)并从ClassA.m和ClassA + Category.m导入它的好方法:

ClassA的+ Private.m

@interface ClassA()
@property(nonatomic) NSString *s;
@end
Run Code Online (Sandbox Code Playgroud)

law*_*cko 10

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

  • 我想说最好只在`.m`中导入`ClassA + Private.h`.在`ClassA.h`中放置`ClassA + Private.h`使得属性对导入`ClassA.h`的所有类都可见,这违反了目的. (3认同)