2012-05-08 2 views

답변

4

NSArray의 자동 릴리즈 된 인스턴스가 반환 된 메서드에서 사용되기 전에 이 릴리즈되지 않도록하려면 어떻게해야합니까?

자동 풀은 당 입니다. 즉, 자동 렌더링 된 객체는 실질적으로 스레드 단위로 발생하는 release으로 지연된 호출입니다.

따라서 호출자와 수신자간에 drain에 대한 호출이 없으면 자동 배출 처리 된 객체가 풀 유출로 인해 해제되는 방식이 없습니다 (심각한 스레딩 어리 석음이없는 경우). 케빈 말한 것처럼 일반적으로

이 풀은 아주 잘 지정된 시간에 배출되어 실행 루프가

•이 GCD를 통해 블록을 파견 루프를 통과 각각의 하단에있는 풀을 소모합니다

• "매시간"(구현 세부 사항) 유출 될 풀 컨텍스트 내에서 실행됩니다. NSOperationQueue가 다른 스레드,

따라서 스스로 일을 할 책임이 있습니다 당신의 간단한 예에서 코드 실행이 검사에 의해, 매우 선형 및 •

유사하게 동작, 사이 실행 스레드에는 드레인있을 수 없다 반환 및 호출자에서의 사용.

(이는 또한 retainCount이 쓸모가없는 이유 중 하나이기 때문에 autorelease으로 인한 "지연된 릴리스"호출을 고려하지도 않으며 스레드 당 보유 수를 계량하지도 않습니다. 실제로는 보유 수/스레드가 스레드 당 하나의 스레드로 유지되는 경우 특정 스레드에서 다른 스레드로 소유권을 명시 적으로 전송하지 않는 한 동일한 스레드에서 스레드를 해제해야합니다.

2

이벤트 루프가 반복되는 동안 자동 해제 풀이 비워집니다. 릴리스 메시지가 자동 릴리즈 된 객체로 보내지는 원인이되기 때문에 여전히 호출 메소드에서 유효합니다.

+1

Nope; 자동 회수 풀은 이벤트 루프를 통과 할 때마다 훨씬 더 자주 또는 덜 자주 소모 될 수 있습니다 ... – bbum

+0

질문의 컨텍스트를 볼 때 특히 흥미로운 질문이 아닙니다. –

+1

그래서 나는 downvote하지 않았다; OP의 질문을 설명하는 동안 OP가 수영장 작동 방식에 대한 상당히 잘못된 인식으로 벗어날 가능성도 있습니다. – bbum

4

자동 회수 된 개체는 주변 풀을 비울 때만 해제됩니다. 이것은 뒤에서 일어나는 마술적인 과정이 아닙니다. 그것은 잘 정의 된 시간에 발생하는 결정 론적 사건입니다. 일반적으로 제어가 실행 루프로 돌아갈 때 풀이 비워집니다. 자신의 중첩 된 풀을 설정하면 그 시간이 제어됩니다.