特定の 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
、適切な引数を指定したときに を使用すると、これは表示されません)。
私はここで私の深さから少し外れています.誰かが私がどこで(そしてどのように)間違ったのか教えてもらえますか?