【问题标题】:Crashes on this line在这条线上崩溃
【发布时间】:2011-04-21 21:28:02
【问题描述】:
NSArray *listItems = [temp componentsSeparatedByString:@","];

谁能告诉我为什么?

temp 是一个 NSString

这是完整的代码

- (NSString *)getStreetAddress
{
    NSString* temp = [addressArray objectAtIndex:0];
    if (temp != nil) {
        NSArray *listItems = [temp componentsSeparatedByString:@","];
        temp = [listItems objectAtIndex:0];
   }
    return temp;
}

EXC_BAD_ACCESS 是错误

【问题讨论】:

  • 确切的错误是什么?
  • 除了Zepplock请求的错误,能否在该行设置断点,输出temp的值是多少?
  • temp的内容是什么?我知道这是 addressArray 的第一项,但是 AddressArray 的内容是什么?

标签: iphone ios ios4 nsstring nsarray


【解决方案1】:

如果执行到你说的那一行,那么最可能的问题是 addressArray 中的第一项在仍然是数组的一部分时被不正确地释放。由于数组不检查以确保它包含的对象有效,因此它将返回一个指向可用内存的指针。当您尝试访问此内存时,它会崩溃。您可以尝试在环境中使用 NSZombiesEnabled=YES 运行。如果我是正确的,您将收到一条错误消息记录到控制台。

【讨论】:

  • addressArray 是一个属性,不是假设 2 像类的全局变量一样吗?
  • 一个属性只能通过该类的实例访问,而不是类本身。问题不在于数组已被释放,而是数组内部的某些东西已被释放。
  • 谢谢,但我怎样才能查看数组内部或防止它被释放?
  • 如果您使用 NSZombies,正如我在回答中提到的那样,当您尝试使用该对象时,您会得到一个日志,它会告诉您它是什么类型的对象,可能还有一些信息包含的对象。您应该检查创建或修改数组的位置,并查找已发布或自动发布太多次的内容。您还可以使用构建和分析选项。分析器非常擅长发现不当的内存管理。
猜你喜欢
  • 2011-08-24
  • 2018-10-10
  • 1970-01-01
  • 1970-01-01
  • 2020-03-25
  • 2012-09-02
  • 2016-11-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多