如何在头文件(.h)中创建一个不可变的readonly属性,一个实现的可变读写属性(.m)

Mat*_*ros 4 iphone cocoa cocoa-touch objective-c ios

我有一个包含字典的对象JSONData.从头文件,以及将访问它的其他类,我希望此属性只是只读和不可变.

@interface MyObject : NSObject

@property (readonly, strong, nonatomic) NSDictionary *JSONData;

@end
Run Code Online (Sandbox Code Playgroud)

但是,我需要它readwrite和实现文件一样可变,就像这样,但这不起作用:

@interface MyObject ()

@property (readwrite, strong, nonatomic) NSMutableDictionary *JSONData;

@end

@implementation MyObject

// Do read/write stuff here.

@end
Run Code Online (Sandbox Code Playgroud)

我有什么办法可以强制执行我想要的那种抽象吗?我看了看其他的问题,虽然我已经知道如何使财产readonly.hreadwrite.m,我无法找到有关的可变性存在的差异.

Mun*_*ndi 7

您的实现中需要一个单独的私有可变变量.您可以覆盖getter以返回不可变对象.

@interface MyObject () {
  NSMutableDictionary *_mutableJSONData;
}
@end

@implementation MyObject 

// ...

-(NSDictionary *)JSONData {
   return [NSDictionary dictionaryWithDictionary:_mutableJSONData];
}

// ...
@end
Run Code Online (Sandbox Code Playgroud)

不需要实现setter readonly.

  • 请注意,如果执行此操作,则无法再在JSONData上使用KVO. (2认同)