2011-09-30 3 views
0

내 문서 기반 앱에 메모리 누수가 있습니다. 그것은 잘 시작, 나는 열거 나 새 문서를 만들 수 있지만 하나 또는 두 번, 그리고 응용 프로그램이 충돌합니다. Xcode에서 분석 도구를 사용했는데 문제가 없습니다.NSDocument - 메모리 누수 및 앱 충돌

그러나 인스트루먼트는 메모리 누수를 표시하지만 코드에있는 부분을 찾을 수 없습니다.
개체 할당을 사용하면 문서를 닫을 때 내 NSDocument 하위 클래스가 해제되지 않는 것을 볼 수 있습니다 ... 이것이 의도 한 동작인지 정말로 모르겠습니다.

-(NSData *)dataOfType:(NSString *)typeName error:(NSError **)outError { 
    NSMutableData *d = [NSMutableData data]; 
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] 
           initForWritingWithMutableData:d]; 
    [archiver encodeObject:[self machine] 
        forKey:IVPCodingKeyMachine]; 
    [archiver finishEncoding]; 
    [archiver release]; 
    if(outError) { 
     *outError = [NSError errorWithDomain:NSOSStatusErrorDomain 
             code:unimpErr 
            userInfo:NULL]; 
    } 
    return d; 
} 

-(BOOL)readFromData:(NSData *)data 
      ofType:(NSString *)typeName 
       error:(NSError **)outErro { 
    NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] 
            initForReadingWithData:data]; 
    machine = [[unarchiver decodeObjectForKey:IVPCodingKeyMachine] retain]; 
    [machine setDelegate:self]; 
    [unarchiver finishDecoding]; 
    [unarchiver release]; 
    if(outError) { 
     *outError = [NSError errorWithDomain:NSOSStatusErrorDomain 
             code:unimpErr 
            userInfo:NULL]; 
    } 
    return YES; 
} 

machine 속성과 같이 선언 : 다음 machine 바르에 @property(readonly) IVPMachine *machine;IVPMachine 클래스 NSCoding 프로토콜을 준수 내가 읽고 문서를 작성하는 방법 여기

이다.

-(id)initWithType:(NSString *)typeName error:(NSError **)outError { 
    self = [super initWithType:typeName error:outError]; 
    if (self) { 
     machine = [[IVPMachine alloc] initWithCreditAmount:2000]; 
     [machine setDelegate:self]; 
     [machine setGame:[[IVPGamesLibrary sharedInstance] 
          objectInGamesAtIndex:0]]; 
    } 
    return self; 
} 

마지막 -(void)dealloc; 방법 나는 machine 바르 해제 : 새 문서의 경우에는 내가 여기, 내가 사용하는 코드를 -(id)initWithType:(NSString *)typeName error:(NSError **)outError; 방법을 무시했다.

버그가있는 곳을 알아낼 수 없습니다. 앱에서 문서를 닫을 때 내 문서 서브 클래스 인스턴스가 해제되어 있지 않습니까?

어떤 도움을 환영합니다. 고맙습니다.

+1

I/O 메소드에서 반환하는 오류가 잘못되었습니다. 당신은 그것들을 명확하게 구현했기 때문에'unimpErr'를 반환하는 것은 의미가 없습니다. 진실에 더 가까운 것을 돌려 주어야합니다. FoundationErrors.h는 시작하기에 좋은 곳입니다 (그리고 그 오류들은'NSCocoaErrorDomain'에 있습니다). –

답변

1

위임을 유지하기 위해 -[IVPMachine setDelegate:]을 구현 했습니까? 그렇다면 그렇게하지 마십시오. 대표는 약한 참조, 즉 보유하지 않아야합니다. IVPMachine을 소유하고 있으므로 소유권을 다시 소유하면 원형 소유권이며 문서와 IVPMachine을 모두 보존합니다.

실제로 더 많은 인스트루먼트를 발굴하십시오. 그것은 누출 된 것이 아니라 누출 된 모든 누출 및 릴리스를 알 수 있습니다. 해당 목록을 살펴보고 균형이 맞지 않는 회원수를 찾으십시오.

+0

당신의 추측은 좋은 것이 었습니다. IVPMachine의 대표는 실제로 유지되었습니다. 할당 할 속성 정의를 변경 한 후에는 더 이상 충돌 동작을 경험하지 않았고 문서가 릴리스되었습니다. 궁금한 점이 있습니다. 인스트루먼트에서 일부 메모리 누출이 여전히 보이지만 하단의 테이블에는 항목이 없습니다. 그러나 바로 그 도구에 깊이 들어가야합니다. 고맙습니다. –