self.dictionary返回null,即使它充满了键和值

时间:2015-12-28 13:42:55

标签: ios objective-c dictionary

我在Xcode上编写一个Sudoku应用程序,对于游戏的每个单元格,我正在配对一个标签和一个按钮,一个是另一个。当用户单击该按钮时,标签上的数字将会改变。我认为NSMutableDictionary可以方便地处理每个按钮/标签对,所以我创建了一个按钮作为键,标签作为值。为了测试字典,我将值打印到其中一个按钮,但是显示为null。这是我的代码:

//Within my ViewController.h file
@property (weak, nonatomic) NSMutableDictionary *dictionary;

//Within my ViewController.m file
 self.dictionary = [NSMutableDictionary dictionary];
//the (id<NSCopying>)self.A1Button is for casting purposes
[self.dictionary setObject: self.A1Label forKey: (id<NSCopying>)self.A1Button];
[self.dictionary setObject: self.A2Label forKey: (id<NSCopying>)self.A2Button];
[self.dictionary setObject: self.A3Label forKey: (id<NSCopying>)self.A3Button];
[self.dictionary setObject: self.A4Label forKey: (id<NSCopying>)self.A4Button];
[self.dictionary setObject: self.A5Label forKey: (id<NSCopying>)self.A5Button];
[self.dictionary setObject: self.A6Label forKey: (id<NSCopying>)self.A6Button];
[self.dictionary setObject: self.A7Label forKey: (id<NSCopying>)self.A7Button];
[self.dictionary setObject: self.A9Label forKey: (id<NSCopying>)self.A9Button];

NSLog(@"%@", [self.dictionary objectForKey:self.A2Button]);

我得到的是:

2015-12-28 05:44:49.940 Sudoku[6349:292670] (null)

有人可以解释发生了什么吗?谢谢!

2 个答案:

答案 0 :(得分:2)

如果A1Button是UIButton,则它不支持NSCopying协议。字典键需要支持它。

@property (weak, nonatomic) NSMutableDictionary *dictionary;

您必须将该属性更改为strong,当然它会崩溃,因为方法copy未在UIButton中实现,因为它不是因为自我。使用nil作业将词典设置为weak 您应该重新审视自己的逻辑,如果您真的想使用UIButton作为密钥,最好使用NSMapTable。更多信息here

答案 1 :(得分:0)

知道了!我使用NSMapTable来存储我的键和值,而不是使用NSMutableDictionary。可以在这里找到这两种数据结构之间差异的一个很好的解释:

NSMapTable and NSMutableDictionary differences

在我的ViewController.h文件中,我写了

  

@property(强,非原子)NSMapTable * mapTable;

声明我的NSMapTable。

然后,在我的ViewController.m文件中,我写了

self.mapTable = [NSMapTable mapTableWithKeyOptions:NSMapTableStrongMemory
                                             valueOptions:NSMapTableWeakMemory];
[self.mapTable setObject: self.A1Label forKey:self.A1Button];
[self.mapTable setObject: self.A2Label forKey:self.A2Button];
[self.mapTable setObject: self.A3Label forKey:self.A3Button];
[self.mapTable setObject: self.A4Label forKey:self.A4Button];
[self.mapTable setObject: self.A5Label forKey:self.A5Button];
[self.mapTable setObject: self.A6Label forKey:self.A6Button];
[self.mapTable setObject: self.A7Label forKey:self.A7Button];
[self.mapTable setObject: self.A8Label forKey:self.A8Button];
[self.mapTable setObject: self.A9Label forKey:self.A9Button];

你可以看到,使用NSMapTable,我可以指定我是想要弱内存还是强内存。我的代码编译没有错误。非常感谢!