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
有人可以建议解决方法吗?
答案 0 :(得分:5)
其他人说的话;用NSAutoreleasePool包装你的代码。 NSAutoreleasePool实际上效率惊人;将产生很少的开销。例如,您不希望用一条代码包围每一行代码,但它们在正常使用中不太可能被测量。
走下这条路是疯狂的。不要打扰。当然 - 有时候最好尽量减少池的使用,但是会有很多案例 - 比如这个 - 它们是不可避免的。
不,真的,我不是在开玩笑:
我有C ++通讯库 很多年前写的。它回电话 每次有网络事件 (有时在新创建的线程中)。 你的建议对我们造成了灾难性的影响 我的申请表现。
我的回答不是建议,而是对Cocoa框架实现的确切规则的非常具体的描述。您的代码之前的工作是巧合。虽然肯定存在行为改变,但对于遵循规则的代码而言,这不是回归。
这样的任意线程在Cocoa中是非常冒险的(好吧,真的,任何地方)。我已经多次完成了这样的集成,并且通常会找到最好的解决方案来处理一个或多个队列中的事件,例如机制,这取决于并发需求。然后队列可以负责定期处理自动释放池。
当然,您描述的真正任意的线程需要一些机制来将数据移动到队列的线程....
答案 1 :(得分:0)
在NSAutoreleasePool中包含您对该类的使用。
答案 2 :(得分:0)
内部NSDecimalNumber似乎使用自动释放的NSString对象。所以你需要有一个自动释放池来捕获它们。
答案 3 :(得分:0)
您尚未告诉我们有关此代码运行的上下文的任何信息。在普通的Cocoa或Carbon应用程序中,您运行代码以响应事件,自动释放池会自动设置。