我正在尝试隐藏@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变量,但这些似乎都不起作用。在这种情况下我该怎么做?
答案 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