Objective c 为什么启用ARC时会发生此自动释放错误?

Objective c 为什么启用ARC时会发生此自动释放错误?,objective-c,automatic-ref-counting,autorelease,Objective C,Automatic Ref Counting,Autorelease,我编写了一个小的CLI程序来删除特定的Safari cookies。从功能上来说,这很好,但它会发出警告,提示对象在没有池的情况下自动释放。我的项目已启用ARC,因此我没有任何自动释放池 这是我的密码: // NSLog replacement from http://stackoverflow.com/a/3487392/1376063 void IFPrint (NSString *format, ...) { va_list args; va_start(args, for

我编写了一个小的CLI程序来删除特定的Safari cookies。从功能上来说,这很好,但它会发出警告,提示对象在没有池的情况下自动释放。我的项目已启用ARC,因此我没有任何自动释放池

这是我的密码:

// NSLog replacement from http://stackoverflow.com/a/3487392/1376063
void IFPrint (NSString *format, ...) {
    va_list args;
    va_start(args, format);

    fputs([[[NSString alloc] initWithFormat:format arguments:args] UTF8String], stdout);
    fputs("\n", stdout);

    va_end(args);
}

int main(int argc, const char * argv[])
{
    NSString *urlSearchString;
    if (argc > 1) {
        urlSearchString = [[NSString alloc] initWithUTF8String:argv[1]];
    }
    else {
        IFPrint(@"No URL provided, quitting.");
        return 1;
    }

    NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];

    NSString *filterString = [[NSString alloc] initWithFormat:@"domain ENDSWITH '%@'", urlSearchString];
    NSPredicate *filter = [NSPredicate predicateWithFormat:filterString];

    NSArray *matchedCookies = [cookieStorage.cookies filteredArrayUsingPredicate:filter];

    for (int i = 0; i < matchedCookies.count; i++) {
        [cookieStorage deleteCookie:[matchedCookies objectAtIndex:i]];
    }

    IFPrint(@"Removed %li cookies", matchedCookies.count);
    return 0;

}
它出现在Xcode调试器中或直接运行发行版二进制文件时有点离题:这些消息不应该从发行版中剥离吗?。导致这种情况的原因似乎是:

NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
类似地,如果我在不传递参数的情况下运行它,我会得到类似的消息:

objc[15630]: Object 0x100114ed0 of class __NSCFString autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug
objc[15630]: Object 0x100114f80 of class __NSCFData autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug
它似乎来自于我正在使用的IFPrint函数,但是当我提供正确的参数时,当我使用IFPrint时,它不会显示出来

我有点不知所措,有人能告诉我哪里出了问题,怎么出了问题吗?

用@autoreleasepool将main的整个身体包裹起来,就像这样:

用@autoreleasepool将main的整个主体包裹起来,如下所示:


您所需要做的就是在主应用程序中添加一个自动释放池

int main(int argc, const char * argv[])
{ 
     @autoreleasepool
     {
         //Your code
     }
}

您所需要做的就是在主应用程序中添加一个自动释放池

int main(int argc, const char * argv[])
{ 
     @autoreleasepool
     {
         //Your code
     }
}

ARC仍然需要自动释放池。像[NSPredicate predicateWithFormat:filterString]这样的方法继续释放一个自动释放的对象,尽管自ARC处理它以来,您不再需要太多的担心。此外,您调用的任何库方法的内部实现都可能在运行时创建任意多个自动释放的对象


您应该通过@autoreleasepool机制将代码包装在自动释放池中。

ARC仍然需要自动释放池。像[NSPredicate predicateWithFormat:filterString]这样的方法继续释放一个自动释放的对象,尽管自ARC处理它以来,您不再需要太多的担心。此外,您调用的任何库方法的内部实现都可能在运行时创建任意多个自动释放的对象


您应该通过@autoreleasepool机制将代码封装在自动释放池中。

正如大家所说,您的主应用程序中需要一个自动释放池。但问题是,如果是这样的话,它是如何被删除的。此外,考虑将这些东西从主目录中取出,并使用像FANDANDDELTEMATCHEDE曲奇这样的方法。但问题是,如果是这样的话,它是如何被删除的。另外,考虑把这些东西从主体中取出,并使用像FANDANDDELTEMATCHED COOKIKE这样的方法。谢谢。直到现在,我似乎已经掩饰了这一点,并侥幸逃脱,或者至少其影响还不明显。谢谢。直到现在,我似乎已经掩饰了这一点,并侥幸逃脱,或者至少其影响还不明显。
int main(int argc, const char * argv[])
{ 
     @autoreleasepool
     {
         //Your code
     }
}