Iphone 未经事先通知而放行是否危险?

Iphone 未经事先通知而放行是否危险?,iphone,objective-c,Iphone,Objective C,我有一些代码,我认为有额外的发布声明 代码不正确吗? 最终的结果是什么? 我还不太了解内存管理-即使在阅读了大量文章和答案之后。谢谢你纠正我的错误 更新:附加的代码段工作正常,但其他代码存在过度发布问题 NSMutableArray *points = [NSMutableArray new]; for (Segment *s in currentWorkout.segments) { [points addObjectsFromArray:[s.track locationPoints]];

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

代码不正确吗? 最终的结果是什么? 我还不太了解内存管理-即使在阅读了大量文章和答案之后。谢谢你纠正我的错误

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

NSMutableArray *points = [NSMutableArray new];
for (Segment *s in currentWorkout.segments) {
 [points addObjectsFromArray:[s.track locationPoints]];
}
[routeMap update:points];
[points release];
请在线查看这篇文章:

这似乎意味着调用release而没有相应的preior调用retain将导致错误的访问错误。

在线查看这篇文章:


这似乎意味着调用release而没有相应的preior调用retain将导致错误的访问错误。

简单的回答是,如果您增加了对象的retain计数,并且不再使用它,则应该释放它,否则您不应该

因此,当您执行[objectName alloc]时,您的计数将增加1,当您使用[NSString stringWithString:]等方法时,这些方法将返回一个自动释放的对象,因此您不需要释放它……如果您执行类似于[NSString stringWithString:]的操作然后,您将增加字符串保留计数,并应在使用完后释放它

我不太确定new是否会增加引用计数,我怀疑会,您可以通过执行[object retainCount]来检查您的保留计数。。。但是请注意,即使retain count大于0,也不意味着您需要释放该对象,因为其他一些类可能有对该对象的引用,因此其retain count增加了一个,而持有该引用的其他类负责释放该对象


希望这能有所帮助一个简短的回答是,如果你增加了一个对象的保留计数,而你不再使用它,你应该释放它,否则你不应该

因此,当您执行[objectName alloc]时,您的计数将增加1,当您使用[NSString stringWithString:]等方法时,这些方法将返回一个自动释放的对象,因此您不需要释放它……如果您执行类似于[NSString stringWithString:]的操作然后,您将增加字符串保留计数,并应在使用完后释放它

我不太确定new是否会增加引用计数,我怀疑会,您可以通过执行[object retainCount]来检查您的保留计数。。。但是请注意,即使retain count大于0,也不意味着您需要释放该对象,因为其他一些类可能有对该对象的引用,因此其retain count增加了一个,而持有该引用的其他类负责释放该对象

希望这对您有所帮助

您应该使用:

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命令,它将搜索您的代码以查找泄漏的引用

您可以从

获取官方内存管理指南。您应该使用:

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命令,它将搜索您的代码以查找泄漏的引用


您可以从

获取官方内存管理指南。您的代码是正确的,但不可取。new充当一个隐含的alloc,它创建保留计数为1的对象


我想我最后一次使用new是在1992年;这并没有错,但是alloc/init被认为是更好的实践,因为它更清楚您在做什么。请阅读,这是对情况的全面总结。

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


我想我最后一次使用new是在1992年;这并没有错,但是alloc/init被认为是更好的实践,因为它更清楚您在做什么。请阅读,这是对情况的全面总结。

没有消息可以安全地发送到解除分配的对象。一旦一个对象被释放了足够的次数,它就会被释放。发送到该对象的任何其他消息都将发送到不再存在的对象。精确的结果并不完全可预测,但通常以崩溃告终。如果你运气不好,它可能会以更奇怪的方式结束-例如,理论上,你可能会得到一个对象A被提前解除分配,对象B被分配到同一个内存位置,然后对象B接收到对象A的消息,而对象B确实理解但当时不应该接收


基本上。从所有权的角度考虑。如果您已声明所有权,则需要释放该所有权。如果您不拥有该对象,则不得将其释放。

无法安全地将任何消息发送到解除分配的对象。一旦一个对象被释放了足够的次数,它就会被释放。发送到该对象的任何其他消息都将发送到不再存在的对象。精确的结果并不完全可预测,但通常以崩溃告终。如果 幸运的是,它可能以更奇怪的方式结束-例如,从理论上讲,可能会导致对象A提前解除分配,对象B分配到同一内存位置,然后对象B接收对象A的消息,对象B确实理解但当时不应该接收


基本上。从所有权的角度考虑。如果您已声明所有权,则需要释放该所有权。如果您不拥有该对象,您不能释放它。

您还需要知道对象保留计数何时增加,这不仅是当您调用retain New allocated objects时返回的保留计数为+1您还需要知道对象保留计数何时增加,这不仅是当您调用retain New allocated objects时返回的保留计数为+1您所说的是真的,但是OP没有过度发布他的数组。没错-我给的链接也这么说。你说的没错,但是OP没有过度发布他的数组。没错-我给的链接也这么说。+new不是关键字。这是一种方法,并记录在案。它是先调用alloc,然后调用init的同义词,意味着一个retain。这个答案有点含糊不清;我建议阅读cocos内存管理指南,因为它非常清楚。+new不是一个关键词。这是一种方法,并记录在案。它是先调用alloc,然后调用init的同义词,意味着一个retain。这个答案有点含糊不清;我建议阅读cocos内存管理指南,因为它非常清楚。Alloc/init在实践中并不被认为是更好的。使用+new.Hi Bill没有什么错。使用new并不是一个错误,它是有效的,但它会让新手感到困惑,这里的证明是最初的问题。它不应该让人困惑+内存管理规则中特别提到了新的。如果您知道它们,并且您应该知道,+new赋予您返回对象的所有权。我真正的问题是关于其他地方的额外发布声明。然而,我确实被这个新概念搞糊涂了,我没有意识到它意味着alloc。谢谢。Alloc/init在实践中并不被认为是更好的。使用+new.Hi Bill没有什么错。使用new并不是一个错误,它是有效的,但它会让新手感到困惑,这里的证明是最初的问题。它不应该让人困惑+内存管理规则中特别提到了新的。如果您知道它们,并且您应该知道,+new赋予您返回对象的所有权。我真正的问题是关于其他地方的额外发布声明。然而,我确实被这个新概念搞糊涂了,我没有意识到它意味着alloc。非常感谢。