아이 폰 의 단일 상태 (singleton) 디자인 모델 (즉, 전체 단일 인 스 턴 스 모델)

예 모드 는 말 그대로 하나의 인 스 턴 스 만 있 고 하나의 인 스 턴 스 만 있 는 것 을 확보 하 며 자체 적 으로 예화 되 어 전체 시스템 에 이 인 스 턴 스 를 제공 하 는 것 이다.그것 은 항상 응용 프로그램 등급 의 공유 자원 통 제 를 하 는 데 쓰 인 다.이 모드 는 사용 빈도 가 매우 높 아서 하나의 사례 류 를 통 해 서로 다른 창 에서 데 이 터 를 전달 할 수 있 습 니 다.objective - c 에서 하나의 사례 류 를 실현 하려 면 적어도 다음 과 같은 네 가지 절 차 를 해 야 합 니 다. 1. 하나의 사례 대상 에 게 정적 인 인 스 턴 스 를 실현 하고 초기 화 한 다음 에 nil 로 설정 합 니 다. 2. 하나의 인 스 턴 스 구조 방법 으로 위 에서 설명 한 정적 인 스 턴 스 가 nil 인지 확인 합 니 다. 만약 에 이 유형의 인 스 턴 스 를 새로 만 들 고 되 돌려 줍 니 다. 3. allocWithZone 방법 을 다시 작성 합 니 다.다른 사람 이 alloc 와 init 를 직접 사용 하여 새로운 실력 을 얻 으 려 고 할 때 새로운 인 스 턴 스 가 생기 지 않도록 합 니 다. 4. alloc WitheZone, copy WithZone, release 와 autorelease, retain 방법 을 적당 하 게 실현 합 니 다.
만약 에 하나의 종 류 를 쓰 려 고 한다 면 하나의 인 스 턴 스 만 존재 하고 이 특정한 인 스 턴 스 가 서 비 스 를 제공 하 는 입 구 를 얻 을 수 있 기 를 바 랍 니 다. 그러면 단일 디자인 모델 을 사용 할 수 있 습 니 다.단일 모드 는 자바, C + + 에서 자주 사용 되 며 코코아 에서 도 가능 합 니 다.
자신 이 단일 모델 을 디자인 하 는 데 어느 정도 위험 이 존재 하기 때문에 주로 다 중 스 레 드 상황 에서 발생 할 수 있 는 문제점 을 고려 하기 때문에 애플 은 다음 과 같은 방식 으로 단일 모델 을 실현 하 는 것 을 제안 한다.
    static MyGizmoClass*sharedGizmoManager = nil;//static        
     
    + (MyGizmoClass*)sharedManager
    {
        @synchronized(self){
            if(sharedGizmoManager == nil) {
                [[selfalloc] init];// assignment not done here
            }
        }
        return sharedGizmoManager;
    }
     
    + (id)allocWithZone:(NSZone*)zone
    {
        @synchronized(self){
            if(sharedGizmoManager == nil) {
                sharedGizmoManager = [super allocWithZone:zone];
                return sharedGizmoManager;  // assignment and return on first allocation
            }
        }
        return nil; //on subsequent allocation attempts return nil
    }
     
    - (id)copyWithZone:(NSZone*)zone
    {
        return self;
    }
     
    - (id)retain
    {
        return self;
    }
     
    - (unsigned)retainCount
    {
        return UINT_MAX;  //denotes an object that cannot be released
    }
     
    - (void)release
    {
        //do nothing
    }
     
    - (id)autorelease
    {
        return self;
    }

좋은 웹페이지 즐겨찾기