2009-09-23 5 views
17

나를 모른 채 자동 리트 리오되는 일부 오브젝트에 대해 약간 짜증이납니다. 아마 그들이하는 일은 좋은 일이지만, 그렇다면 알고 싶습니다. 이 문서는 어떤 메소드가 자동 릴리즈 객체인지는 밝히지 않았으므로, 나는 보통 내 생각에 어리석은 방법으로 테스트를 진행한다. 예를 들어 [NSDate date]는 객체를 자동 렌더링하고 [NSArray arrayWithObjects : ...]도 자동 반환합니다. 문서가 없으면 어떻게 알 수 있습니까?개체가 자동 수령되는지 여부를 확인하는 방법?

정적 함수를 사용하여 개체를 만드는 메서드는 항상 자동 렌더링 된 개체를 반환하지만 패턴을보기 시작합니다. 항상 사실입니까?

+0

나는 "정적 함수"보다는 "클래스 메서드"("인스턴스 메서드"와 반대)를 사용한다고 생각합니다. 아래에서 응답 한대로 +/-는 반환 된 객체가 자동으로 릴리즈되는지 여부를 결정하지 않으며 관례 및 간단한 규칙의 문제입니다. 대부분의 메서드는 보유해야하는 객체를 반환합니다. +1 보유 횟수가있는 객체를 반환하는 메서드는 규칙이 아니라 예외입니다. –

+0

클래스 메서드 나는 실제로 의미. 나는 자바 용어에서 "정적"을 사용했고 어떤 이유로 "함수"를 사용했지만 "메소드"여야했습니다. 어쨌든, 그들은 모두 똑같습니다. :) – quano

답변

21

기본적으로 사용자가 init, copy 또는 retain 인 경우이를 해제해야합니다. 그렇지 않으면 공개하지 않아도됩니다.

https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/MemoryMgmt.html

많은 클래스를 사용하면 클래스의 새로운 인스턴스를 얻을 에 사용할 수있는 형태 + 클래스 명 ... 방법을 제공합니다. 편의상 생성자라고도하는이 메서드는 클래스의 새 인스턴스를 만들고 초기화하고 사용할 수 있도록 반환합니다. 은이 방법으로 생성 된 개체를 공개 할 책임이 있다고 생각할 수도 있지만 소유권에 따라 케이스가 이전에 설정된 정책이 아닙니다. 클래스가 새 개체를 만들기 때문에 개체를 처리하는 것은 입니다.

+0

이것은 좋은 대답입니다. – bobobobo

4

서명 자체가 알려줍니다. "classNameWithData : data1 : data2"와 같은 서명이있는 메소드의 패턴은 해당 객체의 alloc/init/autorelease 인스턴스를 반환하는 것입니다. 그것들은 당신이 그것을 할 필요가 없도록 편의 시설입니다.

autorelease 버전이 필요없는 경우 그런 식으로 인스턴스화하지 말고 적절한 alloc/init을 사용하고 완료되면 해제하십시오. 이 메소드는 훨씬 더 명시 적이며 오류가 발생하기 쉽습니다. 예외가 발생하면 릴리스 블록이 누락 될 수 있지만 그렇게하면 그렇게하는 비용이 발생하기 때문입니다.

+0

+1. 객체를 얻기 위해 alloc/init을 사용하지 않는다면, 자동으로 릴리즈되었다고 가정하고 적절히 처리하십시오. – Abizern

관련 문제