在Objective-C中隐藏不可变接口后面的私有可变属性

时间:2013-09-16 20:22:00

标签: objective-c properties immutability mutable

所以,我基本上想问的是下面的代码是否安全(不是它是否有效,因为它确实如此)。即,公共getter是否会覆盖actionLog属性的合成getter [属于不同类型]?

.h文件:

@interface SomeClass : NSObject
- (NSArray*) actionLog;
@end

.m文件:

@interface SomeClass ()
@property (strong, nonatomic) NSMutableArray* actionLog;
@end

@implementation SomeClass
...
@end

2 个答案:

答案 0 :(得分:5)

这不仅可以,这正是为什么首先要创建类扩展的原因!

是的,会有一个自动合成的ivar和一对getter / setter方法按预期生成。


抱歉 - 错过了NSArrayNSMutableArray部分的对比。不,你做不到;类型必须相同。

然而,你不想再返回你的可变数组。首先,调用者可能修改它(一个bug)。但是,更重要的是,调用者将假设内容是不可变的,如API所暗示的那样,因此,当该数组的内容从调用者下面更改时,它可能会导致问题(例如;调用者可以合理地假设结果为count将保持稳定且可以缓存。

答案 1 :(得分:1)

用可变的ivar支持该属性,如下所示:

.h文件:

@interface SomeClass : NSObject

@property (nonatomic, strong) NSArray *actionLog;

@end

.m文件:

@implementation SomeClass{
    NSMutableArray* _actionLog;
}

-(void)insertAction:(Action *)action{
    if(!_actionLog){
        _actionLog = [[NSMutableArray alloc] init];
    }
    [_actionLog addObject:action];
}

@end