2009-04-29 2 views
0

iPhone에서 내 dealloc의 NSStream 객체에서 release를 호출 할 때 EX_BAD_ACCESS가 발생하는 문제가 있습니다.Objective-C on iPhone 릴리스 문제

[outstream 릴리스]에 다음 코드와 EX_BAD_ACCESS

- (void)dealloc { 
    DLog(@"dealloc started for: %@",self); 
    @synchronized(self) { 
     lookupCount--; 
    if (lookupCount==0) { 
     UIApplication* app = [UIApplication sharedApplication]; 
     app.networkActivityIndicatorVisible = NO; 
     } 
    } 
    DLog(@"inStream retain count before release: %d",[inStream retainCount]); 
    [inStream release]; 
    DLog(@"outStream retain count before release: %d",[outStream retainCount]); 
    [outStream release]; 
    [queryToSend release]; 
    [resultString release]; 
    [data release]; 
    [super dealloc]; 
    NSLog(@"dealloc finsihed for : %@",self); 
    } 

충돌; 행. 이 될 수있는 사람이 왜 어떤 아이디어가 있는지 궁금

2009-04-29 13:16:28.547 App[30580:20b] -[SimpleQuery dealloc] [Line 160] dealloc started for: <SimpleQuery: 0x56e540> 
2009-04-29 13:16:28.547 App[30580:20b] -[SimpleQuery dealloc] [Line 168] inStream retain count before release: 1 
2009-04-29 13:16:28.548 App[30580:20b] -[SimpleQuery dealloc] [Line 170] outStream retain count before release: 1 

을 다음과 같이

로그 출력은?

+0

인스 트림 개체를 어떻게 작성하고 있습니까? 개체가 다른 방법으로 자동 완성 된 경우 일 수 있습니다. 따라서 그 개체를 해제하려고 할 때 실패하는 것입니다. – pgb

+0

getStreamsToHostNamed를 호출하여 생성되었습니다. 포트 : inputStream : outputStream : 자동 다시 렌더링 된 객체를 반환하지 않아야합니다. 생각하지 않아요. –

답변

1

을 확인 inStream를 해제하는 것은 암시 적 outStream 해제하지 않습니다 만드는 당신은 말했다 이것에 대해 outstream

그것은 getStreamsToHostNamed의 호출에 의해 만들어지는 : 포트 : inputStream을 : outputStream : 나는 자동으로 반환하지 말아야한다. objects 나는 생각하지 않는다.

실제로 자동 릴리스됩니다. 코드에서 해당 오브젝트를 유지하지 않는 한, 사용자는 해당 오브젝트의 메모리 관리에 대해 책임지지 않습니다.

Apple Memory Management Guidelines을 살펴 봐야합니다.

많은 클래스는 형태 + 클래스 이름의 방법 ... 당신이 클래스의 새로운 인스턴스를 가져옵니다 에 사용할 수를 제공합니다. 편의상 생성자라고도하는이 메서드는 클래스의 새 인스턴스를 만들고 초기화하고 사용할 수 있도록 반환합니다. 당신이이 방법으로 만든 해제 객체 에 대한 책임 을 생각 할 수 있지만, 그 는 세트 - 메소드 이름이 "ALLOC"또는 "복사"를 포함, 또는로 시작하지 않는 정책 코코아에 따라이 아니다 "new" 클래스가 새 개체를 만들기 때문에 새 개체를 처리하는 것은 입니다.

+0

감사합니다. 이것은 내 차이를 파악하는 것과 매우 흡사합니다. [self setStringVariable : aString]; self.stringVariable = aString; 및 stringVariable = aString; 신디화 된 보유 변수에 대한 –

0

일부 잠재적 인 문제 : 당신은 자기에 고정하고

  • 난 당신이 코드가 다른 스레드에서 실행을 기대 의미 가정합니다 lookupCount의 감소 루프를 수행합니다. 거기에 빨간색 플래그가 있어야합니다. 두 스레드에서 동시에 인스턴스를 할당 해제하는 경우 해당 스레드 중 하나가 이미 할당 해제 된 인스턴스를 할당 해제하려고 시도 할 것이기 때문입니다.
  • 마지막 NSLog 호출은 이미 할당 해제 된 self을 인쇄하려고 시도합니다.

나는 [outStream release]과 관련이 없지만 관련이있을 수 있습니다. 더 많은 정보를 얻으려면 NSZombieEnabled으로 디버깅 해보는 것이 좋습니다. 또한

댓글에서 등,