【问题标题】:Problem assigning value obtained from [array objectAtIndex:]分配从 [array objectAtIndex:] 获得的值的问题
【发布时间】:2011-08-20 05:08:25
【问题描述】:

在我的钢琴课中,我有一个属性(键是另一个自定义类)

@property (nonatomic, retain) Keys *lastPlayed;

在我的一个 Piano 方法中,我使用 Key 对象数组中的一个对象设置 lastPlayed 的值。

self.lastPlayed = [allKeys objectAtIndex:variable];

上面这行代码导致程序崩溃。

我注意到,如果我从 allKeys 数组中硬编码一个特定的 Key 对象,那么它可以正常工作。像这样:

self.lastPlayed = keyC;

有趣的是,如果我将崩溃代码放入不同的方法中,它不会崩溃。

如何防止崩溃?

编辑:

我在 Keys 类中调用此方法,其中我的钢琴是委托

[delegate deliverTagwithNameTag:self.tag]

然后钢琴响应

- (void) deliverTagwithNameTag:(int)nameTag {

self.lastPlayed = [allKeys objectAtIndex:nameTag];

}

【问题讨论】:

  • 请发布崩溃日志的输出,以及更多代码,显示这些行与您的其他代码的关系。
  • 我们需要更多关于这个的信息。我在想它可能是空指针或索引越界异常。但是如果没有更多信息就无法确定。您遇到什么类型的错误?
  • 这就是问题所在,它没有显示一个。当我调用该方法时,它只是崩溃并说访问不正确
  • 你能在 gdb 中输入“bt”吗?

标签: objective-c arrays


【解决方案1】:

您可能不会遇到无法解释的崩溃,您可能会引发异常。您可以查看控制台以找出您引发的异常。通常在这种情况下,告诉您您正在向数组询问越界值(如果 variable 以某种方式收集不正确的值,则可能会发生这种情况),数组本身是无效的(这可能是内存分配问题)或者返回的东西不能存储为lastPlayed(这通常表明你在setter中做一些自定义的事情并且得到了一个意想不到的类)。

因此,为了防止崩溃,请检查您的控制台并查找其中一个问题。

【讨论】:

  • 这一次它出于某种原因没有显示给我。当我尝试调用该方法时,它只是显示了错误的访问权限
  • 是当你尝试调用setter还是当你尝试调用数组时?如果是前者,则可能有人过度释放了您放入数组中的任何内容,如果是后者,则可能有人过度释放了数组。
  • 这一行 [delegate deliverTagwithNameTag:self.tag] 我添加了更多代码来解释
  • 您应该尝试在违规行之前立即记录nameTag[allKeys count] 的值。这会给你更多的信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多