【问题标题】:NSArray release crashes appNSArray 发布崩溃应用
【发布时间】:2011-11-04 08:23:16
【问题描述】:

我正在尝试“标记”从我的文本文件中获取的数据。

当我这样做时,我收到如下错误:

malloc: * 对象 0x844c730 的错误:未分配被释放的指针 * 在 malloc_error_break 中设置断点进行调试

我使用的代码如下所示:

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"mydata" ofType:@"txt"];
NSString *rawText = [NSString stringWithContentsOfFile:filePath encoding:NSASCIIStringEncoding error:nil];
//No error was caused by above line
NSArray *tmp = [rawText componentsSeparatedByString:@"##@@"];
NSString *title = @"";
NSString *detail = @"";
for(int i = 0; i < [tmp count]-1; i++)
{
    NSArray *base = [[tmp objectAtIndex:i] componentsSeparatedByString:@"##"];
    title = [[NSString alloc] initWithFormat:@"%@$$%@",title,[base objectAtIndex:0]];
    detail = [[NSString alloc] initWithFormat:@"%@$$%@ | %@ | %@",
              title,
              [base objectAtIndex:0],
              [base objectAtIndex:1],
              [base objectAtIndex:2]
              ];
    [base release];
}
[tmp release];

一定是这部分代码,因为如果我注释掉这段代码,它就可以正常工作。

阅读上面写着set a breakpoint 的错误,我不知道把它放在malloc_error_break

我的内存管理出了什么问题?

否则我该如何以其他方式拆分字符串?

【问题讨论】:

  • 你确定是 NSArray 版本导致了崩溃吗?程序是否在该行留下 EXC_BAD_ACCESS 或其他内容?
  • 啊,它确实在 main.m 中留下了一个 EXC_BAD_ACCESS 但不在那里
  • main.m 中的 EXC_BAD_ACCESS 没有用。您应该始终使用断点导航器/边栏中的添加按钮在抛出的异常上添加断点。这将导致调试器在引发异常的行上中断,而不是 main.m

标签: objective-c ios memory-management


【解决方案1】:

您从componentsSeparatedByString: 获得了tmp。由于该选择器不以“alloc”或“new”或“copy”或“mutableCopy”开头,并且由于您没有执行[tmp retain],因此您不拥有tmp。所以你不应该这样做[tmp release]

base 也一样。

【讨论】:

  • 我仍在努力解决记忆问题。从事 Java 3 年了:/ - 谢谢!
  • 如果您在 Google 上搜索 objective-c 内存管理,您会发现许多不错的介绍(包括 Apple 的)。但是,如果您可以摆脱对 iOS 5 的要求,ARC(自动引用计数)会让它变得更加容易。
【解决方案2】:

Base 和 temp 是 autorelease 对象,因此您不应释放该对象。

【讨论】:

    【解决方案3】:

    您不必释放base。它已经自动发布了。

    【讨论】:

      【解决方案4】:

      您正在尝试释放数组基而不分配它。 NSArray *base = [[tmp objectAtIndex:i] componentsSeparatedByString:@"##"];没有为 base 分配内存。你不需要 [base release]; 直到分配完毕。

      【讨论】:

      • 当然componentsSeparatedByString: 分配内存。但是返回的数组是自动释放的。那只是意味着当前的自动释放池稍后会为你释放对象。
      猜你喜欢
      • 1970-01-01
      • 2019-01-16
      • 1970-01-01
      • 1970-01-01
      • 2014-11-09
      • 2015-08-08
      • 1970-01-01
      • 2011-01-26
      • 1970-01-01
      相关资源
      最近更新 更多