2009-03-24 5 views
4

클래스 메소드에 전달 된 객체를 유지하고 해제하는 가장 좋은 방법은 무엇입니까? 당신이있는 경우Objective-C 클래스 메소드의 동작 유지 객체

는 예를 들어, "클래스 변수는"과 같이 선언 :

+ (void)myClassMethod:(NSString *)param { 
    _myString = param; 
} 

... 있습니다

static NSString *_myString = nil 

가 ...이 작업을 수행 할 수있는 권리 일 단점이 있기 때문에 호출자가 param에 0이 아닌 보유 개수를 유지해야하므로 단 한 순간에 해제 될 수 있습니다. 또한 사람은이 작업을 수행 할 수 있습니다 : 해당 클래스 수준 dealloc 호출하지 않고 메모리를 누출하는 단점이있다

+ (void)myClassMethod:(NSString *)param { 
    [_myString autorelease]; 
    _myString = [param retain]; 
} 

을 .... 또는 이러한 종류의 클래스 변수를 전체적으로 피하는 것이 좋을까요? 이러한 유형의 객체의 수명을보다 일반적인 방식으로 관리하는 싱글 톤 클래스를 사용해야할까요?

여기에 Apple's docs on creating a singleton instance입니다.

내가 작업하고있는 코드는 매끄러운 (그러나 여전히 새로운) Objective Resource 프로젝트 (http://www.iphoneonrails.com/)입니다.

+0

잘못된 질문을하고 있습니다. 전역 변수를 수행하는 방법을 묻는 대신 글로벌 변수를 제거하는 데 도움을 요청해야합니다. 그리고 네, 이것을 클래스 메소드 (또는 싱글 톤) 뒤에 숨기더라도 여전히 글로벌 변수입니다. – Sven

답변

3

절대적으로 보유 및 출시. 클래스의 dealloc이 호출 될 유일한 시간은 프로그램이 종료 될 때 뿐이므로 누출이 아닙니다. 어쨌든 메모리는 해제됩니다. 첫 번째 방법은 더 번거롭고 코코아 메모리 관리 지침에 위배됩니다.

클래스 메소드 또는 싱글 톤이어야하는지 여부 : 클래스 자체는 일반적으로 많은 독립적 기능을 가져서는 안됩니다. Objective-C에서 클래스 변수가 부족하다는 것을 알 수 있듯이 이들은 Objective-C에서 그렇게 설계되지 않았습니다. 클래스 메소드는 일반적으로 인스턴스 생성 및 관리와 모든 인스턴스에 대한 공유 속성 또는 기본값 저장을 처리해야합니다. 클래스의 실제 기능은 인스턴스로 이동해야합니다. 그것이 Objective-C의 관례입니다.

는 (물론, 어떤 목표 - C 하나님이없는 당신은 규칙을 무시할 수없는 것, 그러나 그것은 일반적인 지혜입니다.) 또한

+0

클래스에는 dealloc 메서드가 없으며 인스턴스 만 수행합니다. – dreamlax

+0

그래, 클래스에 대한 dealloc가 없습니다 -하지만 그건 중요하지 않습니다.합법적으로 글로벌 프로그램 종료에 의해 보유 된 메모리는 일반적으로 누출로 간주되지 않습니다 (모든 싱글 톤은 이와 같이 작동합니다). 확실히 보유를 사용하십시오. –

+0

클래스에는 dealloc 메서드가 없다는 것을 알고 있습니다. 그것이 내가 의미하는 바였습니다. 수업이 그런 방법을 가지고 있었다고하더라도, 그들은 결코 부름을받지 않았습니다. – Chuck

3

, NSString의 경우 또는 변경 가능한 변형이있는 모든 클래스 (에 NSArray 또는 NSDictionary과 같이) 매개 변수를 그대로 유지하는 대신 복사하는 것이 좋습니다. 호출자가 전달한 문자열이 NSMutableString이면 값이 나중에 변경 될 수 있으며 클래스에서도 변경됩니다. 이것은 당신이 원하는 아마, 그래서 이렇게 좋을 걸 :

+ (void)myClassMethod:(NSString *)param { 
    [_myString release]; 
    _myString = [param copy]; 
} 

copy 방법은 사본을 작성하고 1로 카운트를 유지 설정, 그래서 당신은 모든 변수를 유지하는만큼 지금까지 설정하고 걱정. 또한 추가 보너스로 호출자가 NSString을 전달하면 해당 클래스의 값을 변경할 수 없다는 것을 알기에 충분히 똑똑하기 때문에 객체의 복사본을 만들지 않기 만하면됩니다. 얼마나 똑똑한가요?

관련 문제