PeopleClass.h
@interface PeopleClass : NSObject
@property (strong, nonatomic) NSDictionary *people;
@end
我想在.m文件中将people
属性置于可变(NSMutableDictionary
)之上。因此,当我改变people
字典时,更改会反映在接口NSDictionary
我尝试过如下制作iVar,但这不起作用。
PeopleClass.m
@interface PeopleClass ()
{
NSMutableDictionary *people;
}
实现这一目标的最佳方法是什么?
答案 0 :(得分:3)
要做你想做的事,你需要提供自己的实例变量和你自己的setter和getter方法。以下是基本设置:
PeopleClass.h
@interface PeopleClass : NSObject
@property (strong, nonatomic) NSDictionary *people;
@end
PeopleClass.m
@implementation PeopleClass {
NSMutableDictionary *_people;
}
- (NSDictionary *)people {
return [_people copy]; // or just return _people
}
- (void)setPeople:(NSDictionary *)people {
_people = [people mutableCopy];
}
在getter方法中使用copy
是可选的。这取决于您希望如何处理结果。
将属性更改为copy
而不是strong
可能也是有意义的,因为setter和getter的实现真的很荣幸copy
而不只是strong
答案 1 :(得分:1)
您真的不想将可变字典作为对客户端的不可变引用返回。首先,如果你以后发生变异,那么消耗该引用的代码可能会破坏,因为它是在假设它不能变异的情况下编写的。其次,所述代码的一些客户端可能有一个错误,会改变内容,导致代码中断(这发生在Cocoa中)。
相反:
@interface PeopleClass : NSObject
@property (readonly, strong, nonatomic) NSDictionary *people;
@end
在你的.m:
@interface PeopleClass()
@property (strong, nonatomic) NSMutableDictionary *mutablePeople;
- ... init ...
{
....
_mutablePeople = [[NSMutableDictionary alloc] init];
....
}
- (NSDictionary *) people
{
return [_mutablePeople copy];
}
如果复制确实出现性能问题(由检测和分析确定),那么只要后备存储发生变异,您就可以保留副本并使其无效。