没有事先保留的释放危险吗?

时间:2010-04-13 15:34:14

标签: iphone objective-c

我有一些代码,我认为有额外的发布声明。

  1. 代码不正确吗?
  2. 最终结果是什么?
  3. 我还不太了解内存管理 - 即使在阅读了大量文章和stackoverflow答案之后。谢谢你把我拉直了。

    更新:附加的代码段工作正常,但其他代码存在过度释放问题

    NSMutableArray *points = [NSMutableArray new];
    for (Segment *s in currentWorkout.segments) {
     [points addObjectsFromArray:[s.track locationPoints]];
    }
    [routeMap update:points];
    [points release];
    

5 个答案:

答案 0 :(得分:6)

您的代码是正确的,但不建议。 new充当隐含的alloc,它创建保留计数为1的对象。

我认为我最近一次使用新款是在1992年;这没有错,但是alloc / init被认为是更好的做法,因为它更清楚你在做什么。请阅读Apple's guide to memory management,它是对情况的全面总结。

答案 1 :(得分:5)

无法安全地将消息发送到解除分配的对象。一旦一个对象被释放了足够的次数,它就会被释放。发送到该对象的任何其他消息将转到不再存在的对象。准确的结果不是完全可预测的,但通常以崩溃结束。如果你不那么幸运,它可能以更奇怪的方式结束 - 例如,你理论上可以结束一个早期解除分配的对象A和在同一个内存位置分配的对象B,然后对象B接收意味着对象A的消息对象B确实理解但当时不应该接收。

基本上,follow the rules。从所有权的角度来考虑它。如果您声明了所有权,则需要释放该所有权。如果您不拥有该对象,则不得释放该对象。

答案 2 :(得分:0)

在线查看此文章:http://weblog.bignerdranch.com/?p=2

似乎暗示在没有相应的preior调用保留的情况下释放调用将导致BAD_ACCESS错误。

答案 3 :(得分:0)

一个简短的回答是,如果你增加一个对象的保留计数而你不再使用它,你应该释放它,否则你不应该...

因此,当你执行[objectName alloc]时,你将计数增加1,当你使用[NSString stringWithString:]这样的方法时,这些方法返回一个自动释放的对象,所以你不需要释放它...如果你而是做[[NSString stringWithString:] retain]之类的事情然后你增加了字符串保留计数,你应该在使用它之后释放它。

我不太确定new是否增加引用计数(我怀疑它会),你总是可以通过[object retainCount]来检查你的保留计数...但是注意即使保留计数大于0,它并不意味着您需要释放该对象,因为其他一些类可能具有对该对象的引用,因此其保留计数增加一,并且其他类的责任是持有该引用以释放它。

希望这有帮助

答案 4 :(得分:0)

你应该使用:

NSMutableArray *points = [[NSMutableArray alloc] init];
[...]
[routeMap update:points]; //if routemap stores the points, it will need it's own release retain
[points release]; //if there is a retain in the method above, reference will not be cleared

如果不确定,请使用build-> analyze命令,它将搜索您的代码以泄露引用

您可以从http://www.devworld.apple.com/iphone/library/documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.pdf

获取官方内存管理指南
相关问题