如果不与AutoRelease池一起使用,NSDecimalNumber是否会泄漏内存?

时间:2010-06-13 20:11:40

标签: iphone objective-c

NSString* str = [[NSString alloc] initWithString:@"0.05"];
NSDecimalNumber* num = [[NSDecimalNumber alloc] initWithString:str];
NSLog(@" %@", num);
[str release];
[num release];

泄漏内存

*** __NSAutoreleaseNoPool(): Object 0x707990 of class NSCFString autoreleased with no pool in place - just leaking

有人可以建议解决方法吗?

4 个答案:

答案 0 :(得分:5)

其他人说的话;用NSAutoreleasePool包装你的代码。 NSAutoreleasePool实际上效率惊人;将产生很少的开销。例如,您不希望用一条代码包围每一行代码,但它们在正常使用中不太可能被测量。

不要尝试使用没有自动释放池的基础

走下这条路是疯狂的。不要打扰。当然 - 有时候最好尽量减少池的使用,但是会有很多案例 - 比如这个 - 它们是不可避免的。

不,真的,我不是在开玩笑:

Cocoa always expects there to be an autorelease pool available. If a pool is not available, autoreleased objects do not get released and you leak memory. If you send an autorelease message when a pool is not available, Cocoa logs a suitable error message.


  

我有C ++通讯库   很多年前写的。它回电话   每次有网络事件   (有时在新创建的线程中)。   你的建议对我们造成了灾难性的影响   我的申请表现。

我的回答不是建议,而是对Cocoa框架实现的确切规则的非常具体的描述。您的代码之前的工作是巧合。虽然肯定存在行为改变,但对于遵循规则的代码而言,这不是回归。

这样的任意线程在Cocoa中是非常冒险的(好吧,真的,任何地方)。我已经多次完成了这样的集成,并且通常会找到最好的解决方案来处理一个或多个队列中的事件,例如机制,这取决于并发需求。然后队列可以负责定期处理自动释放池。

当然,您描述的真正任意的线程需要一些机制来将数据移动到队列的线程....

答案 1 :(得分:0)

在NSAutoreleasePool中包含您对该类的使用。

答案 2 :(得分:0)

内部NSDecimalNumber似乎使用自动释放的NSString对象。所以你需要有一个自动释放池来捕获它们。

答案 3 :(得分:0)

您尚未告诉我们有关此代码运行的上下文的任何信息。在普通的Cocoa或Carbon应用程序中,您运行代码以响应事件,自动释放池会自动设置。