NSMutableDictionary - 条目似乎被每次添​​加覆盖

时间:2014-07-28 12:28:41

标签: objective-c nsmutabledictionary

我是Objective-C的新手;但是已经编码多年了,这个真的让我感到难过。

我正在尝试构建一个iPhone应用程序,并希望创建一个使用Table格式的“设置”屏幕。 (Xcode 5.1.1)。

我希望将来通过主设置屏幕进行验证,并通过在子程序/方法中隐藏“辛勤工作”来简化应用程序编码。

我可能变得太聪明了,但我为每个'设置'创建了一个类,其中包含屏幕提示,默认值等,并使用Enum交叉引用它(因此编译器会突出显示错别字等)

我遇到的问题是,当我向NSMutableDictionary添加条目并使用lldb打印值时;每个条目似乎都有相同的“关键”和值。我已经尝试将eNum转换为NSNumber并且也作为NSString - 结果没有区别 - 所以我显然做了别的蠢事但是看不到它

以下代码来自各种.m& .h文件,我省略了你总是“必须要”保持简短的无聊的东西

// basic x-ref I want to use in my code
typedef NS_OPTIONS(NSInteger, ConfigurationType)  {
    unDefined = -1,
    Server = 0,
    Id  = 1,
    Phone  = 2
};
// definition for a "single" Settings value
@interface SettingDefinition : NSObject
@end

@implementation SettingDefinition

ConfigurationType _cfgType;
NSString *_cfgName;
NSString *_screenTitle;
NSString *_value;

- (NSString *)description
{
    NSString *className = NSStringFromClass([self class]);
    return [NSString stringWithFormat:@"<%@: x%p Type=%d dbKey=%@ '%@' -> %@>", className, self, _cfgType, _cfgName, _screenTitle, _value];
}
- (id)initType:(ConfigurationType)cfgOption
      withDbKey: (NSString*)dbKey
      asOptionTitle:(NSString*)cfgTitle
      withValue:(NSString*)itmValue
{
    self = [super init];

    if (self) {
        _screenTitle = cfgTitle;
        _cfgName = dbKey;
        _cfgType = cfgOption;
        _value = itmValue;
    }
    return self;
}
@end


@interface Configuration : NSObject
@end
@implementation Configuration {
   NSMutableDictionary *Settings;  // List of Setting structures
};

- (id)init {
    self = [super init];

    if (self) {
        Settings = [[NSMutableDictionary alloc]init];

        [self add:Server withDbKey:@"Server" asOptionTitle:@"Server"];
        [self add:Id     withDbKey:@"Id"     asOptionTitle:@"Your ID"];
        [self add:Phone  withDbKey:@"Phone"  asOptionTitle:@"Phone No."];
    }  
    return self;
}
- (void)    add:(ConfigurationType)cfgOption
      withDbKey:(NSString*)dbKey
  asOptionTitle:(NSString*)cfgTitle
{
     NSString * itmValue = [self configurationValue: cfgOption cfgName:dbKey];
     SettingDefinition *x = [[SettingDefinition alloc]
                               initType:  cfgOption
                               withDbKey:   dbKey
                               asOptionTitle:  cfgTitle
                               withValue: itmValue];
     [Settings setObject:x forKey:[self asKey:cfgOption]]; 
}

- (NSString *) asKey:(ConfigurationType) settingType {
    NSString *rc = [NSString stringWithFormat:@"%d", settingType];
    return rc;
}
- (NSString *) configurationValue:(ConfigurationType) settingType {
    // returns a suitable value from my system setup
    // which is initially a null value until the user sets everything up
}

调试窗口在最后一次调用[self add:...]

后中断时显示以下内容
    (lldb) po Settings
    {
       0 = "<SettingDefinition: x0x8e7c280 Type=2 dbKey=Phone 'Phone No.' -> (null)>";
       1 = "<SettingDefinition: x0x8c703a0 Type=2 dbKey=Phone 'Phone No.' -> (null)>";
       2 = "<SettingDefinition: x0x8e7c310 Type=2 dbKey=Phone 'Phone No.' -> (null)>";
    }

(null)显然是因为'value'中没有数据;但为什么他们都表现为'电话';如果我在第二次调用[self add:..]后休息,他们都显示为'Id'


更新:

DOH!显然它们是全局的(我一直在使用另一个IDE,其中所有东西都是本地的,直到暴露)。如果我在实现中将它们括在括号中作为文档陈述,那么展出的问题就会消失。我有访问变量的属性,但由于setter不仅仅是设置内存,我以为我需要我自己的“变量”来保存数据..说这是愚蠢的东西..谢谢!

0 个答案:

没有答案