Objective c 实例变量超出了方法内的范围

Objective c 实例变量超出了方法内的范围,objective-c,cocoa-touch,methods,scope,argument-passing,Objective C,Cocoa Touch,Methods,Scope,Argument Passing,我有一个从不同类调用的方法: -(void)artworkInfo:(NSNumber *)pos{ [image setImage:(UIImage *)[[mainDelegate.mapAnnotations objectAtIndex:(NSUInteger)pos]image]]; [pos release]; } 我在所有三行上都设置了调试器停止点。调试时,在调用方法之后和调用setImage之前,将鼠标悬停在方法定义和setImage行中的pos上,会显示从方法调

我有一个从不同类调用的方法:

-(void)artworkInfo:(NSNumber *)pos{
    [image setImage:(UIImage *)[[mainDelegate.mapAnnotations objectAtIndex:(NSUInteger)pos]image]];
    [pos release];
}
我在所有三行上都设置了调试器停止点。调试时,在调用方法之后和调用
setImage
之前,将鼠标悬停在方法定义和
setImage
行中的
pos
上,会显示从方法调用发送的正确值。但是,当我进入调试器,下一行
[image setImage…]
运行时,悬停在两个
pos
s上会显示“超出范围”,因此应用程序不会显示它应该显示的图像。为什么会发生这种情况


编辑:好吧,我的问题可能只是在类中如何调用该方法,因为即使是硬编码的值也不会在该方法中生成图像,但如果我将该行复制并粘贴到
viewDidLoad:
,它会生成图像。为什么该行在
viewdiload:
中有效,但在它现在所在的方法中调用它时无效?

您不应该将作为参数传递的对象释放到方法中,这是一种糟糕的做法。并且不应将NSNumber对象强制转换为整数类型

你可能想要像

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

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

一些观察结果:

  • 您应该始终保留接收到的对象
  • 您不应该将NSNumber强制转换为整数。使用[pos intValue]获取整数值
  • 在这种情况下,你不应该发布pos,除非你明确保留了它
    “您应该始终保留接收到的对象”是什么意思?我没有看到任何明显应该保留在这里的内容(尽管
    发布版
    正如你所说肯定是错误的)。这可能是个人偏好的情况,但如果一个方法接收到一个对象引用,我要做的第一件事就是保留它。然后在方法作用域的末尾发布它。老实说,对我来说,这听起来是不必要的低效。如果你真的需要这样做,那就是你的内存管理有一个更大问题的征兆。这当然不正常——看看苹果的任何示例代码或主要Cocoa开发者提供的开源代码,你会发现它还没有完成。你可能是对的。您如何确定哪些需要保留,哪些不需要保留?谢谢,我想这就是我想要的。不幸的是,这似乎不是真正的问题:/I我用仍然错误的内容编辑了我的问题。