当我的应用程序启动时,它循环通过将随机数的值与网格上的坐标键添加到字典中。这是一些代码:
[grid setObject:v forKey:k];
K是“xy”形式的字符串,其中x和y是单个数字整数,V是NSNumber。这两个都在添加之前记录到控制台,所以我知道这些不是问题。但是,尽管此代码运行了49次(对于7 x 7网格),但字典最后是空的。
网格在我的头文件中定义为:
NSMutableDictionary *grid;
然后我在应用程序加载时初始化它(但我不知道是否必须这样做)使用代码:
grid = [[[NSMutableDictionary alloc] init] retain];
这让我很困惑,因为我刚刚开始学习Objective-C,而且我来自更宽容的C#和Python。
提前感谢您的帮助!
答案 0 :(得分:3)
在Objective-C中,向nil
(C#世界中的null
引用)发送消息既合法又常见。结果是nil
,因此通常会默默地传递。一旦你绕过它,这是一个非常有用的工具,使代码更清洁(没有检查null等)。因此,在您向字典添加条目的行中放置一个断点。为此,请单击Xcode中该行旁边的装订线。打开Breakpoints运行应用程序。当调试器停在该行时,您可以将鼠标悬停在grid
上。我怀疑你会发现它是nil
(0x0
)。您还可以打开运行控制台并键入po grid
以打印gdb对grid
的描述。再说一遍,我想你会发现它是零。
如果没有看到更多代码,就无法帮助您找出grid
为nil
的原因。
在旁注中,您不需要-retain
之后的额外alloc/init
。阅读内存Management Programming Guide for Cocoa。这将是你的朋友。