我是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响应以了解该特定的需要建立进入。
有什么建议吗?我应该提供的任何其他信息? 任何帮助都会受到赞赏,我觉得我错过了一些明显的东西,但是我一整天都在抨击这一天没有运气。
答案 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
”,以查看其中的内容以及运行时认为的对象类型。