NSMutableDictionary将一个doesNotRecognizeSelector抛出到objectForKey?

时间:2009-07-01 05:59:55

标签: iphone objective-c nsmutabledictionary custom-view

我是iPhone编程的总菜鸟,而且我遇到了一个被抛出的异常,我无法解决这个问题。

背景:错误发生在自定义子视图中,并在加载程序后立即发生。我在重写的drawRect方法中抛出一个异常。抛出错误的代码如下:

- (void)drawRect:(CGRect)rect{
    NSNumber *points = [NSNumber numberWithInt: star.numberOfPoints];
    //HERE. Doesn't recognize selector?!
    CGPathRef t = (CGPathRef)[starPaths objectForKey:points];
 /*snip*/

starPaths在awakeFromNib中初始化为容量为1的NSMutableDictionary。

抛出的异常是 - [NSObject doesNotRecognizeSelector:]

starPaths在视图的头文件中声明为

    NSMutableDictionary *starPaths;

并初始化为

- (void)awakeFromNib{
    starPaths = [NSMutableDictionary dictionaryWithCapacity: 1];
} 

最后,我无法在代码中找到成功添加元素到字典的点,因为添加条目的代码依赖于从字典中接收nil响应以了解该特定的需要建立进入。

有什么建议吗?我应该提供的任何其他信息? 任何帮助都会受到赞赏,我觉得我错过了一些明显的东西,但是我一整天都在抨击这一天没有运气。

2 个答案:

答案 0 :(得分:5)

如果你没有retain starPaths变量或者用[[NSMutableDictionary alloc] initWithCapacity:1]自己明确地分配它,那么它将在运行循环的下一次迭代中自动释放。

你需要做

starPaths = [[NSMutableDictionary dictionaryWithCapacity:1] retain];

或者

starPaths = [[NSMutableDictionary alloc] initWithCapacity:1];

当您不再需要时,请确保release

答案 1 :(得分:1)

要检查的一些事项:

  • starPaths是否被声明为NSMutableDictionary *实例变量?你提到它已初始化。您是否使用了dictionaryWithCapacity方法(返回自动释放对象)或initWithCapacity(需要明确保留)。为了安全起见,您可能希望保留它并在完成后将其释放。

  • 仔细检查以确保正确包含头文件,以便starPaths的声明包含在使用它的实现文件中。

  • 一般来说,如果你遇到神秘错误,那就与内存损坏有关。尝试在drawRect方法的第一行放置断点,并在调试器控制台窗口中执行“po starPaths”,以查看其中的内容以及运行时认为的对象类型。