1

特定の Safari Cookie を削除する小さな CLI プログラムを作成しました。機能的には問題ありませんが、オブジェクトが「プールを配置せずに自動解放」されているという警告が表示されます。私のプロジェクトでは 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;

}

私が受け取るメッセージは次のとおりです。

objc[15502]: Object 0x107b2bf00 of class NSThread autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug

どちらが 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、適切な引数を指定したときに を使用すると、これは表示されません)。

私はここで私の深さから少し外れています.誰かが私がどこで(そしてどのように)間違ったのか教えてもらえますか?

4

3 に答える 3

3

ARC には引き続き自動解放プールが必要です。などのメソッド[NSPredicate predicateWithFormat:filterString]は、自動解放されたオブジェクトを解放し続けます (ただし、ARC が処理するため、それほど気にする必要はありません)。さらに、呼び出したライブラリ メソッドの内部実装は、実行中に任意の数の自動解放オブジェクトを作成する可能性があります。

@autoreleasepoolメカニズムを介してコードを自動解放プールにラップする必要があります。

于 2012-11-29T00:43:54.633 に答える
1

の本体全体を次のようにラップしmainます@autoreleasepool

int main(int argc, const char * argv[])
{
  @autoreleasepool 
  {
    // your code
  }
}
于 2012-11-29T00:40:34.347 に答える
1

メインに autoreleasepool を追加するだけです。

int main(int argc, const char * argv[])
{ 
     @autoreleasepool
     {
         //Your code
     }
}
于 2012-11-29T00:40:58.307 に答える