2009-10-16 4 views
0

클래스의 인스턴스 메소드가 자신을 해제 할 수 있습니까? 당신이 뭔가를 완료 한 경우객체 클래스의 메소드에서 객체를 해제 할 수 있습니까?

+1

이유를 설명해주세요. – nall

+1

Seconded. 여기서 무엇을하려고합니까? –

+0

기본적으로 같은 질문을 발견 : http://stackoverflow.com/questions/1385433/is-calling-self-release-allowed-to-control-object-lifetime 내 경우는 비슷하지만, 웹 호출을 만들고, sqlite에 쓰고, 자신의 라이프 사이클을 제어합니다. 예를 들어 NSUrlConnection에서 콜백을 받으면 sqlite에 쓰고 완료됩니다. 콜백이 응용 프로그램 위임 일 수 있고 릴리스를 처리한다고 가정하지만이 객체의 일부로 논리를 캡슐화하는 아이디어가 마음에 들었습니다. 릴리스 대신 autorelease를 사용하는 것이 좋습니다. – Alan

답변

1

클래스의 인스턴스 메소드가 자신을 릴리스 할 수 있습니까?

즉 호출하는 방법을 가지고 :

[자동 해제]

내 코드를 호출 한 후 자체에 액세스하지 않을 것으로 가정 [자동 해제]

첫째, 나는 것 나 자신을 풀어 놓을 정말로 좋은 이유가 있기를 바란다. 내가 해낸 유일한 시간은 아이폰에 많은 양의 메모리를 확보하기 위해 버린 싱글 톤에있다. 이것은 드문 사건입니다.

코드는 클래스 개체의 일부입니다. 그러므로, [자기 석방]을 부르는 것은 정말로 문제가되지 않습니다. 물론, [self autorelease]를 호출하면 캡슐화의 관점에서 훨씬 더 안전합니다. 적어도 호출 체인 위로 누군가가 메서드를 호출하면 예외가 발생하지 않습니다.

앤드류

1

당신은이 작업을 수행해야

[self release] 

내 코드를 호출 한 후 자체에 액세스하지 않을 것으로 가정 [자동 해제] :

호출하는 방법을 가지고 like

[self retain]; 

하지만 왜 그렇게할지는 분명하지 않습니다. Cocoa Memory Management Documentation 도움이 될 수도 있습니다

1

릴리스 직후에는 메모리가 많이 이동 하겠지만, [자체 릴리스]가있는 코드는 개체 자체의 메모리 블록에 있습니다. 따라서, [self release]에서 돌아온 후에는 더 이상 할당되지 않고 다른 프로세스에 의해 덮어 쓰여지는 코드로 끝날 수도 있습니다. 가능성이 얼마나 높을 지 말할 수는 없지만 가능한 것 같습니다.

1

비슷한 상황 (요청을 시작한보기보다 오래 지속 될 수있는 웹 대리자의 독립 실행 형 개체 처리 응답)에 대해이 기법을 한 번 사용했습니다.

정상적으로 작동하지만 실제로는 다소 까다 롭습니다. 그때부터 NSOperationQueue에서 NSOperations를 사용하는 것은 요청자와 독립적으로 실행되는 백그라운드 작업을 캡슐화하는 훨씬 더 견고하고 잘 이해 된 방법이라는 것을 알게되었습니다. 일반적으로 작업이 완료되면 주 스레드에서 알림이 전송되어 발신자가 여전히 데이터를 수신 할 준비가되었음을 알립니다.

단순한 원격 요청의 경우 작업이 별도의 스레드에서 실행되고 데이터가 들어오는 동안 주 스레드를 차단하지 않으므로보다 간단한 동기 URL 호출을 사용할 수 있습니다 (예 : URL에서 작은 이미지를 가져 오는 경우 편리함) .

+0

응답 해 주셔서 감사합니다. 사실, 스레드에서 동기 웹 요청을 사용하여 스레드로 처음 작성했습니다. 스레드의 복잡성을 없애기 위해이 새로운 접근 방법을 사용하기 시작했습니다. – Alan

0

할 수 있습니다. 그것은 작동합니다. 약간 위험합니다. 특히 컴파일러 최적화는 의도하지 않은 방식으로 코드를 재정렬 할 수 있기 때문에 위험합니다.

[self autorelease]를 호출하는 것이 더 안전합니다. 가까운 시점에 (즉, 일반적으로 런 루프를 통해 다음 번에) 현재 시점에서 현재 객체를 즉시 해제합니다.

관련 문제