内存泄漏问题NSAutoreleaseNoPool()

Oma*_*ayr 0 memory-leaks memory-management objective-c nsautoreleasepool

我正在尝试创建一个不可变的字符串.我没有使用init,alloc或new初始化它,但仍然内存泄漏,并且它说"类NSCFString的对象0x234b533自动释放,没有池到位 - 只是泄漏"这里是我想要做的

NSMutableString *srn = [NSMutableString stringwithCString:devSID];

// devSID is *char
Run Code Online (Sandbox Code Playgroud)

这留下了泄漏.我也尝试过这个

NSMutableString *srn = [NSMutableString stringwithCString:devSID length:sizeof(devSID)];
Run Code Online (Sandbox Code Playgroud)

但是这也行不通,但是如果我尝试用这样的简单字符串初始化它

NSMutableString *srn = @"this is my string";
Run Code Online (Sandbox Code Playgroud)

它有效,没有任何想法发生什么事情.我没有使用init或alloc,但仍然存在泄漏.如果有人能帮助我解决这个问题,我将不得不承担责任

问候

Umair

Noa*_*oon 8

泄漏是由您自动释放对象引起的,而没有自动释放池来处理它.当您通过创建自己的线程或仅使用-performSelectorInBackground:withObject:便捷方法执行主线程之外的操作时,通常会发生这种情况.如果你想使用autorelease功能(NSMutableString这里使用类方法暗示),你需要在你将使用它的代码块的开头创建一个自动释放池,并在最后将其排空.换句话说,沿着这些方向:

- (void)myBackgroundThing:(id)whatever
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    NSMutableString *srn = [NSMutableString stringwithCString:devSID];

    // etc...

    [pool release];
}
Run Code Online (Sandbox Code Playgroud)

  • 即使一个*不想*使用自动释放功能,许多Cocoa对象也会在幕后进行,所以为后台线程创建一个池几乎总是一个好主意. (2认同)
  • 实际上,在引用计数环境中,您应该*始终*为将使用Cocoa的每个线程创建一个自动释放池.如果你编写一个独立的命令行工具,你也应该在`main()`中创建一个自动释放池. (2认同)
  • @Omayr - 导致崩溃的原因可能是您在池的范围内创建了一个自动释放的对象,然后尝试在池耗尽后很久才访问它.虽然Tariq只是添加一个保留的解决方案可能会导致崩溃,但如果您不创建自动释放池并在完成后释放保留的对象,则会产生内存泄漏.诺亚是解决这个根本问题的正确方法. (2认同)
  • 因为其他人会阅读此内容并实施您错误标记为已接受的解决方案.因此,这个问题将继续困扰开发者.我们看来这是PHP复制和粘贴编码.由于这种类型的编码,多年前解决的问题仍然是一个问题.Brad是正确的评论,并为任何阅读此内容的未来开发人员提供见解.这就是他发布的原因. (2认同)