私有财产,“包裹”二传手

时间:2013-09-05 21:24:13

标签: objective-c

我正在尝试隐藏@property的setter以获取我正在构建的框架中公开提供的标头:

//File: X.h
@interface X 
@property (nonatomic,readonly, strong) NSString* identifier;
@end

我有一个类别,可以为这个界面添加一些方法:

//File: X+implementation.h
@interface X (Implementation)
...
@end

此类别只能在我的项目下访问,即我在构建框架时不会将其公开。许多消息来源说我应该添加一个带有readwrite属性的接口扩展,但这是没用的,因为我的类别不能在“X.m”上看到readwrite定义。所以我想把它添加到类别声明中:

//File: X+implementation.h
@interface X ()
@property (nonatomic, readwrite, strong) NSString* identifier;
@end
//same file
@interface X (Implementation)
...
@end

这个编译但给了我一个 [X setIdentifier:]:无法识别的选择器发送到实例

我试图在X.m上复制扩展,在X.m下手动创建setter,手动@synthesize变量,但这些似乎都不起作用。在这种情况下我该怎么做?

2 个答案:

答案 0 :(得分:1)

在X.h中,像往常一样声明只读属性。

@interface X : XSuperclass
@property (nonatomic,readonly, strong) NSString* identifier;
@end

在X.m中,在类扩展中将属性重新定义为readwrite。这仍将使属性自动合成,从而提供了setter的实现。

@interface X ()
@property (nonatomic,readwrite, strong) NSString* identifier;
@end

@implementation X
// Your class's main implementation
@end

在您的类别的实施文件中,声明 - 但不实施 - 仅对您的类别可见的其他类别。在那里重新声明属性readwrite:

@interface X (CategoryPrivate)
@property (nonatomic,readwrite, strong) NSString* identifier;
@end

@implementation X (Category)

// your category impl here
- (void)methodName {
    self.identifier = @"id";
}

@end

由于readwrite属性的重复声明,这确实存在可维护性问题。但它确实需要比其他方法实现更少的代码和可能的混淆。

答案 1 :(得分:0)

如果您希望该属性是只读的,则不必为此使用类别。

标题

@interface X : NSObject

@property (nonatomic, strong, readonly) NSString *identifier;

@end

<强>实施

@interface X ()

@property (nonatomic, strong, readonly) NSString *identifier;

@end

@implementation X

//.. your implementation goes here

@end