클래스의 인스턴스 메소드가 자신을 해제 할 수 있습니까? 당신이 뭔가를 완료 한 경우객체 클래스의 메소드에서 객체를 해제 할 수 있습니까?
답변
클래스의 인스턴스 메소드가 자신을 릴리스 할 수 있습니까?
즉 호출하는 방법을 가지고 :
[자동 해제]
내 코드를 호출 한 후 자체에 액세스하지 않을 것으로 가정 [자동 해제]
첫째, 나는 것 나 자신을 풀어 놓을 정말로 좋은 이유가 있기를 바란다. 내가 해낸 유일한 시간은 아이폰에 많은 양의 메모리를 확보하기 위해 버린 싱글 톤에있다. 이것은 드문 사건입니다.
코드는 클래스 개체의 일부입니다. 그러므로, [자기 석방]을 부르는 것은 정말로 문제가되지 않습니다. 물론, [self autorelease]를 호출하면 캡슐화의 관점에서 훨씬 더 안전합니다. 적어도 호출 체인 위로 누군가가 메서드를 호출하면 예외가 발생하지 않습니다.
앤드류
당신은이 작업을 수행해야
[self release]
내 코드를 호출 한 후 자체에 액세스하지 않을 것으로 가정 [자동 해제] :
즉
호출하는 방법을 가지고 like[self retain];
하지만 왜 그렇게할지는 분명하지 않습니다. Cocoa Memory Management Documentation 도움이 될 수도 있습니다
릴리스 직후에는 메모리가 많이 이동 하겠지만, [자체 릴리스]가있는 코드는 개체 자체의 메모리 블록에 있습니다. 따라서, [self release]에서 돌아온 후에는 더 이상 할당되지 않고 다른 프로세스에 의해 덮어 쓰여지는 코드로 끝날 수도 있습니다. 가능성이 얼마나 높을 지 말할 수는 없지만 가능한 것 같습니다.
비슷한 상황 (요청을 시작한보기보다 오래 지속 될 수있는 웹 대리자의 독립 실행 형 개체 처리 응답)에 대해이 기법을 한 번 사용했습니다.
정상적으로 작동하지만 실제로는 다소 까다 롭습니다. 그때부터 NSOperationQueue에서 NSOperations를 사용하는 것은 요청자와 독립적으로 실행되는 백그라운드 작업을 캡슐화하는 훨씬 더 견고하고 잘 이해 된 방법이라는 것을 알게되었습니다. 일반적으로 작업이 완료되면 주 스레드에서 알림이 전송되어 발신자가 여전히 데이터를 수신 할 준비가되었음을 알립니다.
단순한 원격 요청의 경우 작업이 별도의 스레드에서 실행되고 데이터가 들어오는 동안 주 스레드를 차단하지 않으므로보다 간단한 동기 URL 호출을 사용할 수 있습니다 (예 : URL에서 작은 이미지를 가져 오는 경우 편리함) .
응답 해 주셔서 감사합니다. 사실, 스레드에서 동기 웹 요청을 사용하여 스레드로 처음 작성했습니다. 스레드의 복잡성을 없애기 위해이 새로운 접근 방법을 사용하기 시작했습니다. – Alan
할 수 있습니다. 그것은 작동합니다. 약간 위험합니다. 특히 컴파일러 최적화는 의도하지 않은 방식으로 코드를 재정렬 할 수 있기 때문에 위험합니다.
[self autorelease]를 호출하는 것이 더 안전합니다. 가까운 시점에 (즉, 일반적으로 런 루프를 통해 다음 번에) 현재 시점에서 현재 객체를 즉시 해제합니다.
- 1. 클래스의 모든 메소드에서 PHP 클래스 객체를 가져와야합니까?
- 2. 내가이 객체를 해제 할 수없는 내가 왜 모르는 객체
- 3. NSURLConnection 객체를 해제 할 수 없습니까?
- 4. dealloc 및/또는 릴리스에서 객체를 자유롭게하거나 해제 할 수 있습니까?
- 5. Objective-C에서 한 줄로 여러 객체를 해제 할 수 있습니까?
- 6. PHP에서 어떻게 현재 객체를 직렬화 해제 할 수 있습니까?
- 7. 다른 클래스의 Dealloc 객체
- 8. 메소드에서 동적으로 할당 된 클래스의 객체를 반환하는 중
- 9. 문서 클래스의 메소드에서 스프라이트를 목표로 지정했습니다. null 객체 참조
- 10. Java 생성자가 서브 클래스의 객체를 구성 할 수 있습니까?
- 11. 인스턴스의 모든 필드를 할당 해제 (해제) 할 수 있습니까?
- 12. 동일한 객체 내에서 객체를 참조 할 수 있습니까?
- 13. 외부 클래스의 생성자에서 내부 클래스의 객체를 만들 수 있습니까?
- 14. Person을 캡슐화하는 ViewModel 객체를 Create 뷰에 전달할 수 있지만 POST Create 액션 메소드에서 Person 객체 만 수신 할 수 있습니까?
- 15. 클래스가 자체 객체를 반환 할 수 있습니까?
- 16. 부모 클래스가 autorelease 풀을 사용하는 객체를 할당 할 수 있습니까?
- 17. Kinect를 사용하여 객체를 식별 할 수 있습니까?
- 18. 코코아 편의 메소드에서 반환 된 객체 처리
- 19. NHibernate 세션에서 객체 연결 해제
- 20. 생성자의 객체를 참조 할 수 있습니까?
- 21. Cipher 객체를 재사용 할 수 있습니까?
- 22. 타입 참조없이 세션 객체를 직렬화 해제 하시겠습니까?
- 23. xml의 날짜 객체를 언 마샬 해제
- 24. 자바 EasyMock은 TestedClass의 메소드에서 객체 호출을 무시합니다.
- 25. Cocoa에서 객체를 할당 해제 할 때 KVO 알림을 수신하지 못하도록해야합니까?
- 26. C++에서 객체를 직렬화 및 비 직렬화 할 수 있습니까?
- 27. 다형성에서 수퍼 클래스의 객체를 사용하여 서브 클래스의 변수에 접근 할 수 있습니까?
- 28. 변수를 정의 해제 할 수 있습니까?
- 29. EXIT_SUCCESS의 정의를 해제 할 수 있습니까?
- 30. MongoDB 캐싱을 해제 할 수 있습니까?
이유를 설명해주세요. – nall
Seconded. 여기서 무엇을하려고합니까? –
기본적으로 같은 질문을 발견 : http://stackoverflow.com/questions/1385433/is-calling-self-release-allowed-to-control-object-lifetime 내 경우는 비슷하지만, 웹 호출을 만들고, sqlite에 쓰고, 자신의 라이프 사이클을 제어합니다. 예를 들어 NSUrlConnection에서 콜백을 받으면 sqlite에 쓰고 완료됩니다. 콜백이 응용 프로그램 위임 일 수 있고 릴리스를 처리한다고 가정하지만이 객체의 일부로 논리를 캡슐화하는 아이디어가 마음에 들었습니다. 릴리스 대신 autorelease를 사용하는 것이 좋습니다. – Alan