2012-07-19 1 views
0

detachNewThreadSelectorref을 사용하여 toTarget 자기를 사용하여 새 스레드를 만들고 있습니다.detachNewThreadSelector로 만든 폴링 스레드를 종료하는 방법은 무엇입니까?

스레드의 목적은 움직임을 폴링하고 적절하게 이미지를로드하는 것입니다. 스레드는 객체 b에 설정된 기본 스레드에서 원자 bool이 true로 설정된 경우에만 반복되고 종료됩니다.

문제는합니다 (detachNewThreadSelector 기준에서)이 기인한다 :

개체 aTarget 및 anArgument가 분리 스레드를 실행하는 동안 유지되고, 그 다음 제 객체를 의미합니다

발매 스레드가 항상 폴링하기 때문에 항상 (최소) 보유 계수가 1입니다. 따라서 dealloc은 호출되지 않습니다.

내 질문은 : 폴링 스레드의 존재를 고려하여 내 개체를 어떻게 dealloc 할 수 있습니까?

지금 내가 가진 유일한 아이디어는 파괴 할 수있는 물체를 기대 내가 을 거라고 모든 곳에서 호출 될 최종 스레드 부울을 설정하는 객체의 destroyThread 기능을 만드는 것입니다. 이 오류가 발생하기 쉬운 것, 더 나은 솔루션이 있습니까?

미리 감사드립니다.

업데이트

나는 다른 해결책에 대한 아이디어가 있었다 - 스레드에서 나는 유지 카운트가 하나 인 경우 감지 - 그 다음 일을 내가 만약 스레드 개체가 살아 유지하는 것을 알고, 그래서 루프를 중단 dealloc이 호출됩니다. 이것은 강력한 솔루션입니까?

답변

2

먼저 detachNewThreadSelector:을 피하십시오. 디스패치 대기열 또는 NSOperationQueue을 사용하여 수행중인 작업은 거의 확실합니다. 수동으로 스레드 (현대 ObjC에서는 매우 드뭅니다)를 작성해야하는 경우에도 명시적인 NSThread 오브젝트를 작성하고 detachNewThreadSelector:을 사용하는 대신 더 이상 직접 상호 작용할 수없는 스레드를 작성하는 것이 좋습니다.

특정 질문에 대해 자신 만의 스레드를 만들면 그 불량배를 dealloc이 아닌 다른 어딘가에 설정해야합니다. 즉, 프로그램의 다른 부분은 시스템 종료를 지시해야합니다. 수동 스레드를 사용하여 이런 식으로 풀어 놓고 자동으로 정리할 수는 없습니다.


편집 : 절대로 retainCount으로 전화하십시오. retainCount과 관련된 해결책은 없습니다. 보다 일반적인 경우에 retainCount을 사용하는 경우 다양한 실제 문제를 제외하고이 경우 수동 참조 카운팅을 사용합니다. 가능한 빨리 ARC로 전환해야하며 retainCount은 ARC에서 불법입니다 (ARC 이전에는 불법 이었음에 틀림 없으나 결국에는 문제를 강제로 수행 할 수있는 정말 좋은 변명이있었습니다). ARC에서 솔루션을 구현할 수 없다면 좋은 해결책은 아닙니다.

가장 좋은 해결책은 GCD 디스패치 대기열 (또는 일반적으로 디스패치 대기열로 구현 된 작업)을 사용하는 것입니다. 그것은 수동 스레드 관리보다 거의 모든 문제에 대해 매우 효율적이고 효과적입니다.

레거시 코드에 수동 스레드를 사용해야하고 이런 종류의 자동 소멸을 유지해야하는 경우 솔루션은 스레드를 소유 한 도우미 개체입니다. 당신의 객체는 도우미 객체를 소유하고 있습니다. 도우미 객체는 스레드와 루프를 유지합니다. 개체가 할당 해제되면 스레드가 종료되도록 지시하고 retain 루프를 중단하고 도우미 개체가 사라집니다. 이것은 보존 루프를 관리하는 표준 방법입니다.

자세한 내용은 Apple의 Migrating Away From Threads을 참조하십시오.

+0

정말 수동으로 스레드를 종료하는 아이디어를 싫어합니다. 왜냐하면 릴리스가 내 개체에 호출 될 때마다 코드를 수정할 필요가 있음을 의미하기 때문입니다. 그러나 다른 조언을 위해 투표했습니다. 다른 솔루션에 대한 아이디어가있었습니다 - 보유 개수가 1인지 여부를 감지하는 스레드에서 - 스레드가 객체를 활성 상태로 유지한다는 것을 알고 있으므로 루프를 중단하고 dealloc이 호출됩니다. 그 해결책에 대해 어떻게 생각하세요? – CiscoIPPhone

+0

수정 사항을 참조하십시오 ...... –

+0

도움 주셔서 감사합니다. Rob! – CiscoIPPhone