2009-07-17 2 views
0

나는 그 의미를 광범위하게 조사했다. 내 생각 엔 어떻게 든 손상된 스택이 있다는 것입니다. 내가 얻을tiny_free_list_add_ptr이란 무엇입니까?

작은 _ free_ list_ add_ PTR 말한다 라인의 16 통화

:

NSDateFormatter *theFormatter = [[NSDateFormatter alloc] init]; 

문제의 원인은 무엇입니까? 내가 부패한 스택이 있다고 생각하는 것이 맞습니까?

- (NSString *)formatDate:(NSString *)uglyDate withFormat:(NSString *)theFormat { 

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    NSDateFormatter *theFormatter = [[NSDateFormatter alloc] init]; 
    [theFormatter setDateFormat:theFormat]; 

    NSDate *realDateUgly = [NSDate dateWithNaturalLanguageString:uglyDate]; 
    if (realDateUgly == nil) 
     realDateUgly = [NSDate dateWithString:uglyDate]; 

    NSString *prettyDate = [[NSString alloc] initWithString:[theFormatter stringFromDate:realDateUgly]]; 

    [pool drain]; 
    [pool release];  
    [theFormatter release]; 
    return prettyDate; 

} 

답변

2
  1. 난 당신이 여기에 풀을 필요로 의심한다.
  2. 풀을 과도하게 출시했습니다. drain은 비 GC 코드에서 release과 같습니다. (release은 GC 코드에서와 같이 중복되므로 no-op이기 때문에)
  3. prettyDate이 누출 중입니다. 당신은 자동 포기해야합니다. (물론, 그 죽일이 좋은 이유는 주변의 수영장, 작동하지 않습니다 수영장.)

을 당신이 Memory Management Programming Guide for Cocoa을 검토하고 메모리 관리 문제를 해결 한 후에는 찾을 중 하나를해야 문제가 해결되었거나 최소한 문제를 추적 할 수 있어야합니다.

메모리 관리를 수정 한 후에도 문제가 계속되면 전체 스택 추적을 포함하도록 질문을 편집하십시오.

+0

빠른 응답을 보내 주셔서 감사합니다. 나는 Autorelease 섹션을 그렇게 빨리 훑어서는 안됩니다. 나는 너의 조언을 듣고 수영장을 옮겼다. 예쁜 날짜에 대해서는 다음과 같이 변경했습니다. NSString * prettyDate = [theFormatter stringFromDate : realDateUgly]; 문제는 더 이상이 기능에 없지만 다른 곳에서는 발생하지 않습니다. Cocoa를위한 메모리 관리 프로그래밍 가이드를 공부할 것입니다. 다시 한번 감사드립니다. –

+0

사실, 한 가지 더 : 나는 아직도 tiny_free_list_add_ptr이 무엇인지 알고 싶습니다. 그냥 궁금해서. :) –

+0

아마 내부 기능, 아마도 malloc 기계 (무료 목록과 관련이 있어야 함). –

0

tiny_free_list_add_ptr에서 충돌하는 것으로 가정합니다. 그렇다면 tiny_free_list_add_ptr은 malloc 구현이 힙의 메모리 블록을 추적하는 데 사용하는 함수처럼 들립니다. 힙이 손상된 경우이 같은 기능이 중단 될 것으로 예상됩니다.

여기 (다른 피터가 지적한 자동 해제 풀과 같은) 또는 다른 방법으로 뭔가를 릴리스했을 것입니다.

NSZombiesEnabled 환경 변수를 설정하여 실행 해보십시오. 나는이 문제를 내기 기꺼이 http://developer.apple.com/technotes/tn2004/tn2124.html#SECFOUNDATION

0

참조하는 것은 이것이다 : 비 GC 응용 프로그램에서

[pool drain]; 
[pool release]; 

, 드레인 릴리스처럼 '동작'. 'Behaves'는 문서에서 사용 된 단어이지만, -drain이 호출 될 때 정확히 무슨 일이 일어나는지 정확하게 예측할 필요가있을 때 문서가 약간 모호합니다. 나에게 최소한 '행동'은 약간의 흔들림이 생기는 방을 허용합니다. 특히 '배수구가 배출과 완전히 동일합니다'와 비교할 때 해석의 여지가 훨씬 적습니다.

내가 이것을 가져 오는 이유는 '드레인이 호출 된 후 자동 풀 풀이 어떻게됩니까?'입니다. 나는이 질문에 대한 문서에서 만족스러운 대답을 찾을 수 없었다. 다른 곳에서 문서는 GC 모드에서 실행될 때 -drain이 GC 시스템에 대한 힌트로 동작하고 objc_collect_if_needed()을 호출 함을 의미합니다. GC 모드에서 실행될 때 자동 배출 풀이 "더 이상 유효하지 않음"(즉, 릴리스 메시지가 전송 된 것처럼 동작하는 행을 따라) 된 드레인 메시지가 있음을 명시 적으로 밝혀 내지 않은 메시지는 찾을 수 없습니다. 문서에서 찾을 수있는 것은 아무 것도 GC 아래에서 실행될 때 인스턴스화 된 NSAutoreleasePool 객체를 여러 번 전송하는 것을 명시 적으로 금지하는 것 같습니다.

내가 찾을 수있는 가장 가까운 것은 NSAutoreleasePool 클래스 문서 상단에있었습니다. '풀을 배수하면 궁극적으로 그것을 배제하는 효과가 있습니다.' 그래도 우리에게 도움이되는 것은 거의 없습니다. GC 또는 non-GC 모드에 적용되는지 여부에 대한 정보가 수집 된 컨텍스트는 그리 명확하지 않습니다. 어쨌든, 그것은 '궁극적으로'라는 말로 자격이 주어 지는데, 이는 농담 사전 정의가 '지금이 아니라 결국'이라는 의미입니다. '궁극적으로'자격이 없으면 인스턴스화 된 자동 실행 풀 개체의 할당이 해제되었는지 여부와 유도로 인해 해당 메시지에 추가 메시지를 보내면 정의되지 않은 동작이 발생한다는 것은 확실하지 않습니다.

이 글을 뒷받침 할 수있는 권위있는 것을 지적 할 수 없기 때문에 non-GC 모드에서 -drain이 '정확히'동작한다고 생각합니다.). 이것이 사실이라면 NSAutoreleasePool 객체가 'over release'되어 있습니다.이 경우 두 문 중 하나를 주석 처리하면 문제가 해결됩니다.

+0

매우 철저합니다. 나는 그것을 좋아한다. –