NSMutableDictionary将一个doesNotRecognizeSelector抛出到objectForKey?

Zxa*_*aos 2 iphone objective-c custom-view nsmutabledictionary

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

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

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

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

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

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

    NSMutableDictionary *starPaths;
Run Code Online (Sandbox Code Playgroud)

并初始化为

- (void)awakeFromNib{
    starPaths = [NSMutableDictionary dictionaryWithCapacity: 1];
} 
Run Code Online (Sandbox Code Playgroud)

最后,我一直没能去的代码,我成功的元素添加到字典中的一个点,因为代码添加一个条目依赖于接收从词典中无响应知道该特定条目需要建成.

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

dre*_*lax 5

如果不这样做retainstarPaths变量或明确自己与分配它[[NSMutableDictionary alloc] initWithCapacity:1],然后它会在运行循环的下一次迭代被自动释放.

你需要这样做

starPaths = [[NSMutableDictionary dictionaryWithCapacity:1] retain];
Run Code Online (Sandbox Code Playgroud)

要么

starPaths = [[NSMutableDictionary alloc] initWithCapacity:1];
Run Code Online (Sandbox Code Playgroud)

release当你不再需要它时,请确保它.

  • 更好的是,只要您想要设置实例变量,就可以使用setter.这样可以保持代码的一致性,并将内存管理的负担全部放在一个方法上. (3认同)