单例字典是空的,我不明白为什么
Singleton dictionary is empty, and I don't see why
我有一个 iOS 应用程序,可以将传入的文本字段与用于导入记录的 标准 字段相匹配。我的问题是使用这些字段的 NSMutableDictionary 是空的!这是保存映射的代码:
-(void)mapUserFields: (id) sender { // move contents of each textField when user has finished entering it
SingletonDictionary *sd = [SingletonDictionary sharedDictionary];
UITextField *tf = (UITextField *)sender; // textfield contains the pointer to user's half of the equation
int tagValue = (int)tf.tag; // get the tag value
[sd.dictionaryOfUserIndexes setObject:tf.text forKey:[NSString stringWithFormat:@"%d", tagValue]]; // value found in textField id'd by tag
NSLog(@"\nfield.text: %@ tagValue: %d nsd.count: %d\n",tf.text, tagValue, sd.dictionaryOfUserIndexes.count);
}
这是 NSLog 的结果:
field.text: 1 tagValue: 38 nsd.count: 0
这是.h文件中单例的定义:
@property (nonatomic, retain) NSMutableDictionary *dictionaryOfUserIndexes;
这是在.m文件中初始化单例的代码:
//-- SingletonDictionaryOfUserIDs --
+ (id) sharedDictionary {
static dispatch_once_t dispatchOncePredicate = 0;
__strong static id _sharedObject = nil;
dispatch_once(&dispatchOncePredicate, ^{
_sharedObject = [[self alloc] init];
});
return _sharedObject;
}
-(id) init {
self = [super init];
if (self) {
dictionaryOfUserIndexes = [NSMutableDictionary new];
}
return self;
}
@end
我认为我的问题是因为 sd.dictionaryOfUserIndexes 没有初始化,但我不确定这是不是真的,如果是的话,如何初始化它(我尝试了几种不同的变体,所有这些都会产生构建错误)。我查看了 SO 和 Google,但没有发现任何解决此特定问题的方法。将不胜感激!
我们可以在此代码中改进一些地方,但唯一 错误 是 init
中对 dictionaryOfUserIndexes
的引用方法。发布的代码不会编译,除非:(a)你有这样一行:
@synthesize dictionaryOfUserIndexes = dictionaryOfUserIndexes;
这样支持变量的命名就没有默认的 _
前缀,或者 (b) 你引用带有默认前缀的 ivar,如:
_dictionaryOfUserIndexes = [NSMutableDictionary new];
另一种方法——在除 init 方法之外的大多数上下文中更可取——是使用合成的 setter,例如:
self.dictionaryOfUserIndexes = [NSMutableDictionary new];
但仅凭这一更改(因此它会编译)您的代码运行良好,向字典添加一个值并记录增加的计数。
我有一个 iOS 应用程序,可以将传入的文本字段与用于导入记录的 标准 字段相匹配。我的问题是使用这些字段的 NSMutableDictionary 是空的!这是保存映射的代码:
-(void)mapUserFields: (id) sender { // move contents of each textField when user has finished entering it
SingletonDictionary *sd = [SingletonDictionary sharedDictionary];
UITextField *tf = (UITextField *)sender; // textfield contains the pointer to user's half of the equation
int tagValue = (int)tf.tag; // get the tag value
[sd.dictionaryOfUserIndexes setObject:tf.text forKey:[NSString stringWithFormat:@"%d", tagValue]]; // value found in textField id'd by tag
NSLog(@"\nfield.text: %@ tagValue: %d nsd.count: %d\n",tf.text, tagValue, sd.dictionaryOfUserIndexes.count);
}
这是 NSLog 的结果:
field.text: 1 tagValue: 38 nsd.count: 0
这是.h文件中单例的定义:
@property (nonatomic, retain) NSMutableDictionary *dictionaryOfUserIndexes;
这是在.m文件中初始化单例的代码:
//-- SingletonDictionaryOfUserIDs --
+ (id) sharedDictionary {
static dispatch_once_t dispatchOncePredicate = 0;
__strong static id _sharedObject = nil;
dispatch_once(&dispatchOncePredicate, ^{
_sharedObject = [[self alloc] init];
});
return _sharedObject;
}
-(id) init {
self = [super init];
if (self) {
dictionaryOfUserIndexes = [NSMutableDictionary new];
}
return self;
}
@end
我认为我的问题是因为 sd.dictionaryOfUserIndexes 没有初始化,但我不确定这是不是真的,如果是的话,如何初始化它(我尝试了几种不同的变体,所有这些都会产生构建错误)。我查看了 SO 和 Google,但没有发现任何解决此特定问题的方法。将不胜感激!
我们可以在此代码中改进一些地方,但唯一 错误 是 init
中对 dictionaryOfUserIndexes
的引用方法。发布的代码不会编译,除非:(a)你有这样一行:
@synthesize dictionaryOfUserIndexes = dictionaryOfUserIndexes;
这样支持变量的命名就没有默认的 _
前缀,或者 (b) 你引用带有默认前缀的 ivar,如:
_dictionaryOfUserIndexes = [NSMutableDictionary new];
另一种方法——在除 init 方法之外的大多数上下文中更可取——是使用合成的 setter,例如:
self.dictionaryOfUserIndexes = [NSMutableDictionary new];
但仅凭这一更改(因此它会编译)您的代码运行良好,向字典添加一个值并记录增加的计数。