0

我正在尝试创建一个不可变的字符串。我没有使用 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 但仍然存在泄漏。如果有人可以帮助我解决此问题,我将不胜感激

问候

乌迈尔

4

2 回答 2

8

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

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

    NSMutableString *srn = [NSMutableString stringwithCString:devSID];

    // etc...

    [pool release];
}
于 2010-11-30T08:16:23.193 回答
-1

尝试这样的事情

[[NSString stringWithCString:"Hello"] 保留];

保留是一种评估您最初未创建的对象的对象所有权的方法,因此这扩展了我们将每个分配与释放或自动释放匹配的规则

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

于 2010-11-30T10:15:16.813 回答