如何正确访问类NSMutableDictionary实例变量

时间:2011-04-29 18:37:28

标签: iphone objective-c nsmutabledictionary getter-setter

所以我一直在阅读编码最佳实践,以及使用setter / getters访问和更改自定义类的实例变量的重要性,而不是将变量公开并直接访问它们。

但是如何转换为访问Mutable Dictionary实例变量中的值?

具体来说,我有一个自定义类。该类有许多实例变量,其中一个是NSMutableDictionary。对于“非数组”实例变量(BOOL等),我理解如何“正确”访问它们:使用点表示法和setter / getter方法。

但对于我的NSMutableDictionary变量,setter / getter只是访问整个字典,对吧?那么,从我的控制器,如何正确设置/获取里面的类字典?

实际上,这个问题甚至适用于类实现的代码:

采用我的方便init方法,例如:

- (id) initWithID:(int)ID
{
    if (self = [super init]) {
        [self initProcedure];
        [myData setObject:[NSNumber numberWithInt:ID] forKey:@"ID"];    
    }
    return self;
}

我直接访问实例变量“myData”,而不是使用setter / getter方法。我知道这是“允许的”,但据我所知,这不是最好的方式。但是如何在字典中使用setter / getters作为值?

然后,回到我们开始的地方,我如何从类实现之外,从我的Controller那里做到这一点?

对于我的简单类实例变量,它只是myClassInstance.aClassVariable = someValue

但如果我想修改“myData”中的内容怎么办?

我是否会做[myclassInstance.myData setObject:... forKey:...]之类的事情(我知道这不正确,我只是想让我的问题/疑惑清楚。

我想我可以创建我在控制器中调用的自定义类方法,例如[myclassInstance editMyDataWithObject:... forKey:...]

但这看起来很笨重,仍然让我们回到类本身内部的实现问题,以及如何正确使用setter / getter技术来访问字典的成员变量,而不是直接修改字典本身。

抱歉这个长度,希望我的问题很清楚。谢谢!

2 个答案:

答案 0 :(得分:0)

如果您需要知道内部集合何时发生变异或只想控制突变,那么您应该将该属性公开为不可变的,并将变异方法添加到您的类中,如上所述。 (我不认为这个笨重)

[myclassInstance editMyDataWithObject:... forKey:...]

myclassInstance中要支持的每种类型的突变创建一个方法,例如replace,remove,insert等。

您现在可以控制所有突变,并且不允许任何外部类别在您不知情的情况下进行更改。

@interface MyClass : NSObject
{
    NSMutableDictionary *myData;
}

@property(readonly) NSDictionary *myData;

@end

@implementation MyClass
@dynamic myData;

- (id) initWithID:(int)ID
{
    if (self = [super init]) {
        [self initProcedure];
        [myData setObject:[NSNumber numberWithInt:ID] forKey:@"ID"];    
    }
    return self;
}

-(NSArray*)myData
{
    return [[myData copy] autorelease];
}

...

//All mutation methods

@end

答案 1 :(得分:0)

您可以定义动态属性以访问基于字典的变量:

@interface MyClass : NSObject
{
    NSMutableDictionary *myData;
}

@property (nonatomic, retain) NSNumber myProperty;

@end

@implementation MyClass
@dynamic myProperty;

- (NSNumber) myProperty {
    return [myData objectForKey: @"myProperty"]: 
}

- (void) setMyProperty(NSNumber *value) {
    [myData setObject: value forKey: @"myProperty"]: 
}
@end

对于字典中保存的每个变量,您可以使用动态属性公开其内容,而不会暴露字典本身。从外面看,如果觉得这个类有点语法功能。