2009-05-21 2 views
5

임 메신저 꽤 새로운 objective-c 프로그래밍 및 객체 릴리스는 가장 큰 두통입니다. 나는 언제 출시해야하는지에 대해 항상 의심하고 있으며, 잘못된 변수를 발표하고 잘못된 EXEC 충돌을 일으키기 시작했습니다. 메모리 관리에 대한 Apple 가이드를 읽었지만 항상 예제에서 코드로 이동하지 않습니다.싱글 톤의 Objective-C 릴리즈

이러한 상황 중 하나는 내 싱글 톤입니다 (큰 싱글 톤 녀석입니다).

나는 일이 같은 정의가 내 코드에서

static Configuration* _instance; 

+(Configuration*)getInstance{ 
    if (_instance == NULL){ 
     _instance = [Configuration alloc]; 
     [_instance initConfig]; 
    } 
    return _instance; 
} 

을 나는이처럼 사용

//Store configuration  
Configuration* conf = [Configuration getInstance]; 
conf.userName = self.userName.text; 
conf.cellPhone = self.phoneNumber.text; 

내가 "conf의"변수를 해제해야합니까?

언제 _instance를 출시해야합니까?

이 코드를 iPhone에서 실행하고 있기 때문에 출시하지 않은 버전은 어떻게됩니까? 그들은 iPhone 성능에 영향을 미칠 것입니까?

답변

8

"_instance = [Configuration alloc]; [_instance initConfig];"으로 구성 인스턴스를 만들었을 때 " 그것은 alloc 호출에서 하나의 유지 카운트를 가졌다. "conf.cellPhone = self.phoneNumber.text;"후에 conf를 해제하려면 그 시점에서 할당이 해제됩니다.

alloc 또는 copy 또는 mutableCopy를 사용하여 처음으로 객체를 만들면 보유 수는 1이됩니다. 보유 수는 1 씩 증가하여 증가합니다. release를 호출 할 때마다 1 씩 감소합니다. autorelease를 호출하면 "나중에 나에게 호출하기"라는 의미입니다. 따라서 retain과 release가 체크와 같은 경우, autorelease는 미래의 체크와 같은 것입니다.

구성 싱글 톤에 액세스하는 코드는 그것을 유지하거나 복사하거나 변경할 수 없으므로이를 해제하면 안됩니다.

이제 코드가 작성되었으므로 Configuration 객체는 결코 릴리스되지 않으며 응용 프로그램의 전체 수명 동안 살게됩니다. 이는 일반적으로 싱글 톤으로 원하는 것입니다.

+0

이것 좀 봐 주시겠습니까? http://stackoverflow.com/questions/6928028/objective-c-alloc-release-error-in-singleton-class – Spring

2

변수를 보유하지 않았으므로 conf 변수를 해제 할 필요가 없습니다.

일반적으로 보유 수를 증가시키는 메소드와 호출을 감소시키는 메소드의 균형을 조정해야합니다.

init, retain은 증가하고, release은 감소합니다.

클래스가 언로드 될 때 주 _instance가 릴리스되므로 사용자가 신경 쓸 필요가 없다고 생각합니다.