2012-02-28 4 views
0

버퍼를 샘플링하는 오디오 클래스가 있고 NSNotification으로 다른 클래스를 호출하고 데이터 (int)를 보냅니다.경고없이 풀로 리트리브 되었습니까?

class __NSCFNumber autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() 

class __NSCFString autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug 

무엇을 뜻 않습니다

내가 두 번째 많은 여러 번 실행이 warnning을 얻을? 예. 해당 클래스에 NSNumber이고 NSString입니다. 할당되지 않았습니다.

다른 스레드가 필요합니까? 뭐가 잘못 되었나요?

감사합니다.

+1

'objc_autoreleaseNoPool()'에 중단 점을 넣으면 어떻게됩니까? 스택에 무엇이 표시됩니까? – user1118321

+0

objc_autoreleaseNoPool()에 중단 점을 두는 방법 –

답변

1

코드가 실행되는 스레드가 무엇이든 해당 코드가 실행되기 전에 autorelease pool이 설정되지 않았 음을 의미합니다. AppKit 또는 UIKit 기반 응용 프로그램의 경우 프레임 워크는 일반적으로 주 스레드에서 하나를 관리하지만 다른 스레드를 사용하는 경우에는 직접 만들어야합니다. AppKit 또는 UIKit을 기반으로하지 않는 응용 프로그램의 경우 Objective-C 코드를 실행할 때 항상 자동 릴리스 풀이 있는지 확인해야합니다.

+0

ARC를 사용하고 있는데도 여전히 발생합니까? 이 문제가 발생하지만 Xcode에서 NSAutoreleasePool을 추가 할 수 없습니다. – Justin

+0

@ Justin :'@ autoreleasepool' 지시자가 작동해야합니다. 그렇지 않습니까? – Chuck

+0

예, 있습니다. 고마워. – Justin

1

응용 프로그램의 main() 함수에 자동 복구 풀을 사용합니까? autoreleased 인스턴스를 사용합니까 (예, alloc-init하지 않았지만 [NSNumber numberWith ...]는 alloc-init-autoreleased 오브젝트를 반환합니다) 메인 스레드가 아닌 다른 스레드에서 사용합니까? 처음에 자동 복구 풀을 설정하지 않았거나 다중 스레드를 사용중인 경우 각 스레드에 대해 개별 NSAutoreleasePool을 만들어야합니다.

+1

그런 식으로 생성되는 것 외에도 객체가 자동으로 리사이즈 될 수있는 이유는 여러 가지가 있습니다. 예를 들어 많은 액세서 구현이 자동 릴리즈 된 객체 일 수 있습니다. 가장 안전한 버전의 getter (합성 된 접근 자에 의해 사용 된 것 같음)는'autorelease를 반환합니다 '. autorelease 풀을 제자리에 두지 않고 임의의 Foundation 기반 코드를 실행하는 것은 일반적으로 안전하지 않습니다. – Chuck

+0

예. 하지만 가장 안전한 Getter 반환 유지 - autorelease 말할하지 않습니다. 객체가 존재하지 않는다면 객체의 존재를 기대해서는 안되기 때문에 일종의 "남용"또는 "과다 사용"의 안전성이 있습니다. –

+0

이것은 Apple이 승인 한 관행이므로, 나는 그것을 "학대"라고 거의 부르지 않을 것입니다. 여하튼, 그것은 아주 일반적입니다, 그래서 나는이 관용어를 만났을 때 오동작하는 코드를 작성하고 싶지 않을 것입니다. – Chuck

관련 문제