实例变量超出了方法范围

时间:2011-05-10 16:53:26

标签: objective-c cocoa-touch methods scope argument-passing

我有这个方法可以从另一个类调用:

-(void)artworkInfo:(NSNumber *)pos{
    [image setImage:(UIImage *)[[mainDelegate.mapAnnotations objectAtIndex:(NSUInteger)pos]image]];
    [pos release];
}

我在所有三行上都设置了调试器停止点。调试时,在调用方法之后且在调用setImage之前,将鼠标悬停在方法定义和pos行中的setImage上会显示从中发送的正确值方法调用。但是,当我在调试器中前进并且下一行[image setImage...]在两个pos显示“超出范围”时悬停时,因此应用程序不会显示应该显示的图像。为什么会这样?

编辑:好吧,似乎我的问题可能只是如何在类中调用该方法,因为即使是硬编码的值也不会在方法中生成图像,但如果我复制并且将该行粘贴到viewDidLoad:,确实如此。为什么该行在viewDidLoad:中起作用,而不是在现在的方法中调用它?

3 个答案:

答案 0 :(得分:1)

你不应该将作为参数传递的对象释放到方法中,这是不好的做法。并且你不应该将NSNumber对象强制转换为NSUInteger类型。

你可能需要像...这样的东西。

[pos intValue]//This will return the integer value of pos.

答案 1 :(得分:1)

一些观察结果:

  1. 您应该始终保留您收到的对象。
  2. 您不应该将NSNumber强制转换为NSUInteger。使用[pos intValue]获取整数值。
  3. 除非您明确保留pos,否则不应该在这种情况下释放pos。

答案 2 :(得分:0)

也许mapAnnotations中的图像之前已被释放。我不知道你为什么要释放pos,因为它是一个参数,所以它有一个隐式自动释放。请尝试删除[pos release]