我得到在控制台此错误信息:
*** _NSAutoreleaseNoPool(): Object 0x10d2e0 of class NSPathStore2 autoreleased with no pool in place - just leaking
我想不出有什么错误?
谢谢。
我得到在控制台此错误信息:
*** _NSAutoreleaseNoPool(): Object 0x10d2e0 of class NSPathStore2 autoreleased with no pool in place - just leaking
我想不出有什么错误?
谢谢。
这是一个典型的内存管理的问题,你是自动释放一些对象,而无需到位自动释放池。 自动释放是不是魔术。 有类型的对象NSAutoreleasePool
保持跟踪你“不时”自动释放并释放他们所有的对象:
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
// An autoreleased object referenced by our pool.
id object = [NSNumber numberWithInt:1];
[pool drain];
// Our object no longer valid.
每个线程都有自己的自动释放池。 这是非常合乎逻辑的,因为线程“同时”运行,如果他们有着共同的自动释放池时,它会释放一个对象,而你还在使用它。
现在的点。 有一个在每一个应用程序的主线程,这意味着你不必去想这一切,并自动释放对象收集就好了一个默认的自动释放池。 但是,如果你创建另一个线程,你通常不得不同时创建该线程自动释放池。 否则,有权利要求任何人在自动释放的对象,他们只是泄漏。 这也正是你所得到的警告。
泄漏的线程,但不自动释放池可以是这样的:
- (void) doSomethingInBackground
{
id object = [NSNumber numberWithInt:1];
}
- (void) someOtherMethod
{
[self performSelectorInBackground:@selector(doSomethingInBackground);
}
解决方法是简单的:
- (void) doSomethingInBackground
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
id object = [NSNumber numberWithInt:1];
[pool drain];
}
现在,你只需要找出你在另一个线程中运行的代码。
这听起来像你已经产生了推上了一个新的线程的方法(可能使用+ (void)detachNewThreadSelector:(SEL)aSelector toTarget:(id)aTarget withObject:(id)anArgument;
是在自己的线程运行的任何方法,都需要有一个自动释放池设置了捕捉任何自动释放的对象:
- (void)myLovelyThreadedMethod
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
... // your code here
[pool release];
}
尝试使用锵静态分析器