0

我正在尝试隐藏我正在构建的框架中公开可用的标头的 @property 的设置器:

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

我有一个向这个接口添加一些方法的类别:

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

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

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

这编译但给了我一个[X setIdentifier:]: unrecognized selector sent to instance

我尝试在 Xm 上复制扩展,在 Xm 下手动创建设置器,手动 @synthesize 变量,但这些似乎都不起作用。在这种情况下我该怎么办?

4

2 回答 2

1

在 Xh 中像往常一样声明只读属性。

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

在 Xm 中,在类扩展中将属性重新定义为 readwrite。这仍然会使属性自动合成,从而提供设置器的实现。

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

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

在您的类别的实现文件中,声明(但不实现)仅对您的类别可见的不同类别。在那里将属性重新声明为读写:

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

@implementation X (Category)

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

@end

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

于 2013-09-06T03:08:39.570 回答
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
于 2013-09-05T21:40:31.547 回答