我有以下代码来检索我的 iOS 应用程序上的文件路径:
static const NSString * fullPathFromRelativePath(NSString *relPath)
{
// do not convert a path starting with '/'
if(([relPath length] > 0) && ([relPath characterAtIndex:0] == '/'))
return relPath;
NSMutableArray *imagePathComponents = [NSMutableArray arrayWithArray:[relPath pathComponents]];
NSString *file = [imagePathComponents lastObject];
[imagePathComponents removeLastObject];
NSString *imageDirectory = [NSString pathWithComponents:imagePathComponents];
NSString *fullpath = [[NSBundle mainBundle] pathForResource:file
ofType:NULL
inDirectory:imageDirectory];
if (!fullpath)
fullpath = relPath;
return fullpath;
}
static const char * fullCPathFromRelativePath(const char *cPath)
{
NSString *relPath = [NSString stringWithCString:cPath encoding:NSUTF8StringEncoding];
const NSString *path = fullPathFromRelativePath(relPath);
const char *c_path = [path UTF8String];
return c_path;
}
static const char * relativeCPathForFile(const char *fileName)
{
NSString *relPath = [NSString stringWithCString:fileName encoding:NSUTF8StringEncoding];
const NSString *path = fullPathFromRelativePath(relPath);
const char *c_path = [[path stringByDeletingLastPathComponent] UTF8String];
return c_path;
}
我在调试控制台中收到了很多这样的消息:
objc[4501]: Object 0x6e17060 of class __NSCFString autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug
objc[4501]: Object 0x6e12470 of class NSPathStore2 autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug
objc[4501]: Object 0x6e12580 of class __NSCFData autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug
代码有什么问题? (我什至使用带有“自动”保留/释放等功能的 iOS 5)
干杯。
最佳答案
当您在堆栈中没有任何释放池的线程上自动释放对象时,会显示此消息。默认情况下,主线程上总是有一个自动释放池。它是在 UIApplicationMain()
函数中创建和管理的,该函数通常由您的应用程序的 main() 函数调用。但是,您创建的其他线程(使用 performSelectorInBackground:
或 NSThread
)没有适当的自动释放池,除非您专门将一个自动释放池放在那里,因此该后台线程上的任何自动释放对象都没有池来稍后释放它们,只会泄漏。
如果您要启动后台线程,您应该做的第一件事就是创建一个自动释放池。在 ARC 下,使用新的 @autoreleasepool
构造来做到这一点。
关于iphone - 为什么静态 NSString 会泄漏?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6475727/