2012-11-29 2 views
1

나를 위해 특정 Safari 쿠키를 삭제하는 작은 CLI 프로그램을 작성했습니다. 기능적으로는 괜찮지 만 오브젝트에 대한 경고는 "풀에서 풀을 사용하지 않고 자동 렌더링"된다는 것입니다. 내 프로젝트에 ARC가 사용 설정되어 있으므로 자동 풀이없는 이유는 무엇입니까?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 

:해야하지 이러한 메시지가 "릴리스"빌드에서 제거해야합니까?). I '는 IFPrint 기능에서 온 나타납니다

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 

: 나는 비슷한 메시지가

NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage]; 

마찬가지로, 내가 인수를 전달하지 않고 그것을 실행하는 경우 : 그것을 일으키는 줄은 것 같다 내가 올바른 인수를 제공 할 때 IFPrint을 사용할 때 이것은 표시되지 않습니다.

나는 여기서 내 깊이를 벗어났다. 누군가 내가 어디로 (그리고 어떻게) 잘못 갔는지를 보여줄 수 있는가?

+0

모두가 말했듯이, 당신은 당신의 메인에'autorelease' 풀이 필요합니다. 그러나 문제는 처음에 어떻게 삭제되었는지입니다 (일어난 경우). 또한, 메인에서 물건을 가져 와서'findAndDeleteMatchedCookies'와 같은 메소드를 사용하는 것을 고려하십시오. –

답변

3

ARC에는 여전히 자동 해제 풀이 필요합니다. [NSPredicate predicateWithFormat:filterString]과 같은 메소드는 자동 렌더링 된 객체를 계속 릴리스합니다 (ARC가 처리 한 이후로 더 이상 모든 것을 신경 쓰지 않아도 됨). 또한 호출하는 라이브러리 메소드의 내부 구현은 실행 중에 자동으로 릴리즈 된 객체를 임의로 만들 수 있습니다.

@autoreleasepool 메커니즘을 통해 자동 풀에 코드를 래핑해야합니다.

+0

감사합니다. 나는 어떻게 든 그 위에 광택을 내고, 지금까지 그것과 함께 알아 들었다 (또는 최소한 그 효과가 눈에 띄지 않고 있었다). – robmathers

1

랩과 같이 @autoreleasepoolmain의 몸 전체는 :

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

당신이해야 할 모든 주에서 autoreleasepool를 추가합니다.

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