2012-07-17 4 views
1

나는 아마도 이것을 overthinking 해요.내가 만든 NSThread를 출시해야합니까?

// Inside some method... 
NSThread *thread = [[NSThread alloc] initWithTarget:functionWrapper selector:@selector(run) object:nil]; 
[thread start]; 

이 후 [thread release]를 호출 : A. 메모리 누수를 방지하고 필요 또는 ... B. 물건을 깰 것이다.

this question에 대한 대답은 스레드가 실행을 마쳤을 때 스레드가 스스로를 릴리스하지만 그 동작은 문서화되어 있다는 것을 나타냅니다.

+0

여기에 https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Multithreading/CreatingThreads/CreatingThreads.html – onmyway133

답변

5

예 autorelease 또는 release를 통해 나중에 언젠가 릴리스해야합니다. 당신이

[self performSelectorInBackground:@selector(yourMethod) withObject:nil]; 

처럼, 자신을 스레드 A가 새로운 allocing없이 스레딩을 구현하는 그러나, 당신이 정말로 처음에 자신의 스레드를 초기화하기 위해서 필요가 없습니다

는 목표 - C는 많은 방법이있다 또한 작업을 대기열에 넣을 수있는 NSOperations입니다.

+0

제가 그 일을 할 수 있는지 보도록하겠습니다. 다른 사람의 코드를 살펴보면, 필요하지 않은 코드가 생겨날 수 있습니다. –

+0

및 GCD를 잊지 마세요. (이 질문은 http://stackoverflow.com/q/5502906/210171 참조) – nielsbot

+0

backgrounding 제안을 주셔서 감사합니다. 처음부터 시작할 수 있다면 GCD를 사용할 것입니다. –

2

일반적으로 : 개체에 alloc, new 또는 copy를 호출하면이를 해제해야합니다.

해당 스레드의 수명주기가 완료되면 (또는 dealloc 함수에서) [thread release]으로 전화하십시오.

당신이 링크 된 답변과의 차이점은 문자열의 끝에 autorelease가 있음을 알 수 있습니다 (자동 검색은 위의 규칙이 적용되지 않는 인스턴스입니다.이 경우 객체는 자동으로 해제됩니다). 현재 주 실행 루프의 끝이므로 현재 범위 전체에서 실행됩니다).

+0

이 있습니다. 자동 실행은 다음 번에 실행이 처리 될 때까지 메모리를 계속 유지한다고 생각했습니다. 자동 풀 풀. 참조 카운팅은 실제로 가비지 콜렉션 일 것입니다. –

+2

@BenFlynn Autoreleasing은 autorelease 풀의 다음 배출시 오브젝트의 보유 횟수가 1 씩 감소 함을 의미합니다.이 작업이 발생하기 전에 다른 것으로 유지되지 않으면 할당 해제됩니다. 위에서 언급 한 것처럼 객체를 nil로 설정하는 것과는 아무런 관련이 없습니다. 자동 리사이징은 답변에서 굵게 글자로 표시된 규칙으로 릴리스하는 것과 같습니다 (지연된 릴리스 일뿐입니다). – borrrden

+1

@BenFlynn 정정되었고, 보르 든이 정교 해짐에 따라, 나는 자동 회수 풀 배출의 본질에 대해 착각했다. 잘못된 정보가 퍼지지 않도록 내 대답을 편집했습니다. – andycam