内存泄漏问题NSAutoreleaseNoPool()

时间:2010-11-30 08:10:29

标签: objective-c memory-management memory-leaks nsautoreleasepool

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

NSMutableString *srn = [NSMutableString stringwithCString:devSID];

// devSID is *char
这留下了泄漏。我也试过这个

NSMutableString *srn = [NSMutableString stringwithCString:devSID length:sizeof(devSID)];

但这也不起作用,但是如果我尝试使用像这样的简单字符串初始化它

NSMutableString *srn = @"this is my string";

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

此致

Umair

2 个答案:

答案 0 :(得分:8)

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

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

    NSMutableString *srn = [NSMutableString stringwithCString:devSID];

    // etc...

    [pool release];
}

答案 1 :(得分:-1)

尝试这样的事情

[[NSString stringWithCString:“Hello”] retain];

retain是一种评估您最初未创建的对象的对象所有权的方法,因此这扩展了我们使用release或autorelease匹配每个alloc的规则

注意:如果保留此对象,则必须平衡发布计数。如果您不释放保留的对象,那么您将面临内存泄漏问题。

相关问题