【问题标题】:Instance variable goes out of scope inside method实例变量超出方法内部的范围
【发布时间】:2011-08-22 15:37:16
【问题描述】:

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    一些观察:

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

    【讨论】:

    • “您应该始终保留收到的对象”是什么意思?我没有看到任何明显应该保留在这里的东西(尽管你说的release 肯定是错误的)。
    • 这可能是个人喜好的情况,但是如果一个方法接收到一个对象引用,我要做的第一件事就是保留它。然后我在方法范围的末尾释放它。
    • 老实说,这听起来对我来说是不必要的低效率。如果您确实需要这样做,那是您的内存管理存在更大问题的症状。这当然是不正常的——查看任何来自主要 Cocoa 开发人员的 Apple 示例代码或开源代码,你会发现它还没有完成。
    • 您可能是对的。您如何确定哪些需要保留,哪些不需要?
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      你可能想要...

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

      【讨论】:

      • 谢谢,我想这就是我想要的。不幸的是,这似乎不是真正的问题:/我编辑了我的问题仍然有问题。
      猜你喜欢
      • 2023-03-19
      • 1970-01-01
      • 2021-10-04
      • 1970-01-01
      • 2015-11-15
      • 1970-01-01
      • 2014-03-12
      • 2010-12-06
      • 1970-01-01
      相关资源
      最近更新 更多