Objective-C:在实现文件中改变属性

时间:2016-09-29 17:14:44

标签: objective-c

PeopleClass.h

@interface PeopleClass : NSObject
@property (strong, nonatomic) NSDictionary *people;
@end

我想在.m文件中将people属性置于可变(NSMutableDictionary)之上。因此,当我改变people字典时,更改会反映在接口NSDictionary

我尝试过如下制作iVar,但这不起作用。

PeopleClass.m

@interface PeopleClass ()
{
    NSMutableDictionary *people;   
}

实现这一目标的最佳方法是什么?

2 个答案:

答案 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];
}

如果复制确实出现性能问题(由检测和分析确定),那么只要后备存储发生变异,您就可以保留副本并使其无效。