在Objective-C中拥有一个私有可变的公共不可变只读数组属性的最有效方法是什么?
我最近在关于如何最好地在Objective-C中实现具有底层mutable存储的只读、不可变的数组属性的评论中遇到了一个小分歧(但不是不友好的意见)。(这些评论后来被移至聊天室。) 首先,让我明确我想要什么在Objective-C中拥有一个私有可变的公共不可变只读数组属性的最有效方法是什么?,objective-c,Objective C,我最近在关于如何最好地在Objective-C中实现具有底层mutable存储的只读、不可变的数组属性的评论中遇到了一个小分歧(但不是不友好的意见)。(这些评论后来被移至聊天室。) 首先,让我明确我想要什么 我想要一个只读的属性,即它是不可分配的myObject.array=另一个数组应失败 我希望该属性的类型是不可变的,这样就不能通过属性本身向其添加新元素。显然,这意味着属性的类型应该是NSArray 我希望该属性的存储(即ivar)是可变的,因为我将在包含类上提供方法来对其进行变异 由于有些
myObject.array=另一个数组应失败
NSArray
froggbox
类的frogs
属性的,不多也不少
我将使用链接问题中相同的人为示例,一盒青蛙,称为FrogBox
:
@interface FrogBox : NSObject
@property (nonatomic, readonly) NSArray *frogs;
- (void)addFrog:(Frog*)frog;
- (void)removeFrog:(Frog*)frog;
@end
@implementation FrogBox {
NSMutableArray *_frogs;
}
@dynamic frogs;
- (instancetype)init {
self = [super init];
if (self) {
_frogs = [NSMutableArray array];
}
return self;
}
- (NSArray*)frogs {
return _frogs;
}
- (void)addFrog:(Frog*)frog {
[_frogs addObject:frog];
}
- (void)removeFrog:(Frog*)frog {
// Frog implements isEqual and hash.
[_frogs removeObject:frog];
}
@end
现在,让我们把事情弄清楚。这里不严格需要@dynamic
指令。使用@dynamic
可抑制青蛙
属性的ivar自动合成。当然,如果automatic synthesis看到一个ivar与它将创建的名称相同,它只使用提供的名称。那我为什么要用它呢?我认为它增加了清晰度,并表明了意图。如果你不喜欢它,就想象它不在那里。这与这个问题无关
问题不在于想要一个公共只读、不可变和私人可变的属性是否是一个好主意。这是关于这是否是实现这一目标的最有效的方式(就语法和时钟周期而言)。我相信是的,但我想听听社区的意见,我完全愿意改变主意
readonly copy
NSArray属性。这会照顾到你的1和2;这个东西现在无法写入,它是一个不可变的数组readwrite
。现在我有权从这个类中分配给它。为了实现一个变异方法,我使用mutableCopy
阅读,调用一个NSMutableArray方法,然后设置-从而自动再次获得一个不可变的NSArray。尽管使用了“复制”一词,但实际上没有开销readonly copy
NSArray属性。这会照顾到你的1和2;这个东西现在无法写入,它是一个不可变的数组readwrite
。现在我有权从这个类中分配给它。为了实现一个变异方法,我使用mutableCopy
阅读,调用一个NSMutableArray方法,然后设置-从而自动再次获得一个不可变的NSArray。尽管使用了“复制”一词,但实际上没有开销readonly copy
NSArray属性。这会照顾到你的1和2;这个东西现在无法写入,它是一个不可变的数组readwrite
。现在我有权从这个类中分配给它。为了实现一个变异方法,我使用mutableCopy
阅读,调用一个NSMutableArray方法,然后设置-从而自动再次获得一个不可变的NSArray。尽管使用了“复制”一词,但实际上没有开销