Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 内存泄漏问题NSAutoreleaseNoPool()_Objective C_Memory Management_Memory Leaks_Nsautoreleasepool - Fatal编程技术网

Objective c 内存泄漏问题NSAutoreleaseNoPool()

Objective c 内存泄漏问题NSAutoreleaseNoPool(),objective-c,memory-management,memory-leaks,nsautoreleasepool,Objective C,Memory Management,Memory Leaks,Nsautoreleasepool,我试图创建一个不可变的字符串。我并没有用init、alloc或new初始化它,但内存仍然在泄漏,它说“NSCFString类的对象0x234b533在没有池的情况下自动释放-只是泄漏”,这就是我试图做的 NSMutableString *srn = [NSMutableString stringwithCString:devSID]; // devSID is *char 这留下了漏洞。我也试过这个 NSMutableString *srn = [NSMutableString string

我试图创建一个不可变的字符串。我并没有用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

泄漏是由于您在没有设置自动释放池的情况下自动释放对象造成的。这通常发生在除了主线程之外的其他事情时,通过创建自己的线程或仅使用
-performSelectorInBackground:withObject:
便利方法。如果您想使用自动释放功能(这里使用的是
NSMutableString
类方法),您需要在代码块的开头创建一个自动释放池,在代码块的末尾使用它并将其排出。换言之,大致如下:

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

    NSMutableString *srn = [NSMutableString stringwithCString:devSID];

    // etc...

    [pool release];
}

试试这样的

[[nsstringwithcstring:“Hello”]retain]

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


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

即使您不想使用自动释放功能,许多Cocoa对象也会在后台这样做,因此为后台线程创建一个池几乎总是一个好主意。实际上,在引用计数环境中,您应该始终为将使用Cocoa的每个线程创建一个自动释放池。如果您编写一个独立的命令行工具,您也应该在
main()
中创建一个AutoRelease池。您使用的是
NSMutableString
方法,该方法返回一个自动删除的对象。因此,您需要一个自动释放池。至于添加此项时应用程序崩溃,我们需要查看更多代码。@Omayr-导致崩溃的原因可能是您在池的范围内创建了一个自动释放的对象,然后在池耗尽后尝试稍后访问它。虽然Tariq只添加保留的解决方案可能不会导致崩溃,但如果不创建自动释放池并在完成保留对象后释放它,则会造成内存泄漏。Noah's是这里根本问题的正确解决方案。因为其他人会读到这篇文章并实施你错误地标记为已接受的解决方案。因此,这个问题将继续困扰开发商。我们在PHP复制粘贴编码中看到了这一点。由于这种类型的编码,多年前解决的问题仍然是一个问题。Brad对阅读本文的任何未来开发人员发表评论并提供见解是正确的。这就是他发布的原因。你没有收到最后一条的编译器警告吗?只有一行。。。这家伙解决了我的问题。。。谢谢Buddy你需要在
保留
和以后的
发布
之间取得平衡,否则你会泄漏内存。@paul@Omayr实际上问题是他在分配的自动释放池中创建了一个自动释放对象。。这就是我建议他保留那件物品的原因。。现在,他必须在完成功能部件后立即释放该对象。这个答案是错误的,因为它没有解决根本问题,并且会导致内存泄漏。正如Noah所说,自动释放池需要到位,否则任何自动释放的对象都会泄漏。仅仅因为某些东西起作用而发表评论并不意味着这是正确的答案。找出应用程序中断的原因,并为中断找到正确的解决方案才是正确的解决方案。这就像在飞机上贴胶带一样。