NSMutableDictionary 向 objectForKey 抛出 doesNotRecognizeSelector 吗?
-
21-08-2019 - |
题
我对 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];
}
最后,我无法在代码中成功地将元素添加到字典中,因为添加条目的代码依赖于从字典接收零响应来知道该特定条目需要被建造。
有什么建议么?我还需要提供其他信息吗?任何帮助都将不胜感激,我觉得我错过了一些明显的东西,但我一整天都在为此苦苦挣扎,但没有运气。
解决方案
如果你不 retain
这 starPaths
变量或自己显式分配它 [[NSMutableDictionary alloc] initWithCapacity:1]
然后它将在运行循环的下一次迭代中自动释放。
你需要做
starPaths = [[NSMutableDictionary dictionaryWithCapacity:1] retain];
或者
starPaths = [[NSMutableDictionary alloc] initWithCapacity:1];
只要确保 release
当你不再需要它时。
其他提示
有几件事需要检查:
starPaths 是否声明为 NSMutableDictionary* 实例变量?您提到它已初始化。您使用的是dictionaryWithCapacity方法(返回自动释放对象)还是initWithCapacity(需要显式保留)。为了安全起见,您可能需要保留它并在完成后释放它。
仔细检查以确保正确包含头文件,以便 starPaths 的声明包含在使用它的实现文件中。
一般来说,如果您遇到神秘错误,则与内存损坏有关。尝试在drawRect方法的第一行放置一个断点并执行“
po starPaths
” 在调试器控制台窗口中查看其中的内容以及运行时认为它是什么类型的对象。