0

autorelease pool에서 "익사 (drowning)"라고 불리는 문제가 생겼습니다.Autorelease Drowning

내 코드는 객체를 올바르게 생성하고 소멸시킵니다. 그러나, 나는 그것에 대해 알지 못하고 여러 변수를 autorelease하는 몇 가지 클래스 메소드를 사용한다. 그들은 매분마다 수천 회와 수천 회를 반복한다고 생각합니다 ... 나는 프로그램에서 잃어버린 수천 개의 미발표 물체에 익사하고 있습니다.

2 질문 : 그러니 내가 AT ALL 클래스 메소드를 사용하지 않는

  1. 은 - 영구적 인 해결책이, 또는 심지어, 몇 가지 인스턴스 메소드 (재단, UIKit는) 여전히없이 객체를 autorelease를하는 것이 내 그것에 대해 알고 있습니까?

  2. 또는 클래스 메소드를 호출하기 전에 자동 릴리즈 풀을 할당하고 클래스 메소드를 호출 한 후이를 배수 할 수 있습니다. 이것이 영구적 인 해결책입니까?

답변

2
  1. 당신은 오토 릴리즈 객체를 피하기 위해거야 의미하지 않는다 클래스 메소드를 사용하지 않습니다 그냥 때문이다. 예 : NSString * path = [anotherString stringByAppendingPathComponent:@"foo"]은 자동 렌더링 된 객체를 반환하지만 아직 클래스 메소드가 포함되어 있지 않습니다. 내가 아는 한, 자동 접 해제 된 객체를 피하는 유일한 방법은 객체를 사용하지 않는 것입니다. 이 실제로 인 경우 CoreFoundation을 확인하십시오. (나는 그 길을 가고 권장하지 않습니다.) 당신은 오토 릴리즈 풀의 톤을 만들어 어떤 미친 팩토리 메소드이있는 경우, 그때는 아마 이런 식으로 뭔가 할 줄

  2. : 명시 적으로 유지함으로써

    + (id) crazyFactoryMethodWithFoo:(id)foo { 
        NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 
        id returnValue = nil; 
        //generate gobs of autoreleased objects 
        returnValue = [something retain]; 
        [pool release]; 
        return [returnValue autorelease]; 
    }

    을 풀을 배수하기 전에 반환 값을 반환하면 반환 값은 자동 해제 풀을 파괴 할 수 없도록 유지됩니다. 그런 다음 retain의 균형을 유지하고 반환 값을 자동 렌더링하고 반환합니다.

+0

@Dave DeLong 좋았어. 문제는 NSUserDefaults를 항상 사용하는 것입니다 ... 그리고이 클래스의 메서드는 자동 변환 된 객체를 만듭니다. 이제 나는 왜 애플이 그것을 추천하지 않는지 이해한다. 또한 언급 한 것과 같이 NSString 메서드를 항상 사용합니다. 그리고 반복하면서, 나는이 이상한 문제들을 얻는다. NSUserDefaults를 쉽게 대체 할 수있는 제안은 무엇입니까? 감사. – GSchv

+0

@GSchv 왜 NSUserDefaults를 대체해야한다고 생각하십니까? autoreleased 객체를 반환하고 현재 autorelease 풀의 수명을 넘은 객체에 매달려 있다면, 객체를 '보유'하고 (작업을 완료 한 후에 객체를 release하십시오). –

+0

'[pool drain]'은 http://developer.apple.com/mac/library/documentation/cocoa/reference/foundation/Classes/NSAutoreleasePool_Class/Reference/Reference에서 선호하는 방법입니다.html # // apple_ref/occ/instm/NSAutoreleasePool/release – cobbal

2

Dave DeLong이 이미 귀하의 질문에 대답했지만 일반적으로 수영장을 너무 높게 채우는 유일한 경우는 매우 단단한 루프에있는 경우입니다. 이 경우 루프의 반복마다 다른 자동 릴리스 풀을 생성하면됩니다.

for (NSUInteger i = 0; i < 1000000000; i++) 
{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    // do the work 

    [pool release]; 
} 

개체는 현재 스레드에 대해 가장 최근에 생성 된 자동 해제 풀에 자동으로 추가됩니다. 루프의 반복마다 하나씩 작성하여 실행 루프 풀에 쌓아두기보다는 원치 않는 오브젝트를 신속하게 제거 할 수 있습니다.

+0

그래, 유일한 대안 인 것 같습니다. 감사. – GSchv

관련 문제