我有一些代码,我认为有额外的发布声明。
我还不太了解内存管理 - 即使在阅读了大量文章和stackoverflow答案之后。谢谢你把我拉直了。
更新:附加的代码段工作正常,但其他代码存在过度释放问题
NSMutableArray *points = [NSMutableArray new];
for (Segment *s in currentWorkout.segments) {
[points addObjectsFromArray:[s.track locationPoints]];
}
[routeMap update:points];
[points release];
答案 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命令,它将搜索您的代码以泄露引用
获取官方内存管理指南