2

我对 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 响应才能知道该特定条目需要被建造。

有什么建议么?我应该提供任何其他信息吗?任何帮助都将不胜感激,我觉得我遗漏了一些明显的东西,但我整天都在为此苦苦挣扎,没有运气。

4

2 回答 2

5

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

你需要做

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

或者

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

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

于 2009-07-01T06:37:33.570 回答
1

需要检查的几件事:

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

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

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

于 2009-07-01T06:40:54.610 回答