iOS 남용 방지 단일 사례

3547 단어

단일 모드:

  • 클래스는 하나의 실례만 있을 수 있고 익숙한 방문점에서 방문해야 한다.
  • 이 유일한 실례는 하위 클래스화만 확장할 수 있고 확장 대상은 클라이언트의 코드를 파괴하지 않는다.
  • 단일 모델은 고객 클래스가 공유 자원에 유일한 실례를 생성하고 이를 통해 공유 자원에 접근할 수 있도록 익숙한 방문점을 제공한다.
  • 정적 전역 대상 인용이나 클래스 방법도 전역 접근점을 제공할 수 있지만 전역 대상은 클래스가 한 번 이상 초기화되는 것을 방지할 수 없고 클래스 방법도 결합을 없애는 유연성이 부족하다.
  • 정적 전역 변수는 클래스의 실례에 대한 유일한 인용을 유지하지만 프로그램에 두 개의 동일한 대상 유형이 있으면 같은 공유 자원의 읽기와 입력을 확보할 수 없다.
  • 클래스 방법은 공유 서비스를 제공하여 대상을 만들지 않아도 접근할 수 있다.자원의 유일한 실례는 클래스 방법에서 유지할 수 있다.그러나 클래스가 더 좋은 서비스를 제공하기 위해 이불을 분류해야 할 때 클래스 방법은 이 문제를 해결할 수 없다.

  • 단일 모드 사용 시 주의해야 할 문제

  • 단일 대상이 여러 개의 라인에 접근해야 한다면, 라인을 안전하게 하는 것이 중요하다.그러나 우리가 단일 예시 대상을 찾을 때, 일반적으로 주위에 @synchronized () 프로그램 블록이나 NSLock 자물쇠가 추가된 실례를 검사해야 한다.
  • "단례는 양가죽을 쓴 전체적인 상태다."하나의 예는 의존을 명확하게 설명할 필요가 없이 어느 곳에서든 사용할 수 있다.
  • 하나의 예는 전체 국면의 상태만 저장하고 그 어떠한 작용역과도 연결할 수 없습니다.만약 이러한 상태의 역할 영역이 완전한 응용 프로그램의 생명 주기보다 짧다면, 이 상태는 하나의 예로 관리해서는 안 된다.
  • 사용자의 귀속 상태를 하나의 예로 관리하는 것은 좋은 디자인 방식이 아니기 때문에 자신의 디자인 방안을 재평가해야 한다.

  • 예를 들어 잘못된 단례 사용을 설명하다

  • 현재 우리가 하나의 예를 만들었다고 가정하면 이 예는 하나의 속성을 가지고 있다. 우리는 우선 MessageType로 가정한다.
  • 메시지 타입은userMessage(유저메시지)와 BroadcastMessage(방송메시지)로 나뉜다.코드 블록:
  •          #import 
             @interface MessageCenterManager : NSObject
    
             @property (nonatomic ,assign) NSInteger messageType;
             + (instancetype)sharedInstance;
             @end
           
            .m 
             #import "MessageCenterManager.h"
             static MessageCenterManager *_sharedInstance;
             @implementation MessageCenterManager
             + (instancetype)sharedInstance{
                  static dispatch_once_t onceToken;
                 dispatch_once(&onceToken, ^{
                          _sharedInstance = [[MessageCenterManager alloc] init];
                 });
                 return _sharedInstance;
             }
    
             -(id)copyWithZone:(NSZone *)zone{
                 return _sharedInstance;
             }
    
             +(id)allocWithZone:(struct _NSZone *)zone{
                    static dispatch_once_t onceToken;
                            dispatch_once(&onceToken, ^{
                                _sharedInstance = [super allocWithZone:zone];
                             });
                   return _sharedInstance;
             }
            @end
    

    이때 우리는 하나의 예를 만들었는데, 아래의 용법을 보면, 잘못된 것이고, 안전하지 않다.
           #import "UserMessage.h"
           @implementation UserMessage
           - (void)someMethod{
          // , 
            if([MessageCenterManager sharedInstance].messageType){
                  //do something
            }else{
            }
           }
           @end
    
           # 
            @implementation BroadcastMessage
             - (void)someMethod{
                    [[MessageCenterManager sharedInstance] setMessageType:0];
              }
            @end
    

    중요한 일에 경고를 가하다

  • 이런 상황은 BroadcastMessage가 UserMessage를 현식으로 인용하고 관계를 나타낼 때만 발생할 수 있다.여기에 단례를 사용했는데 전역과 다상태의 특성을 가지기 때문에 전혀 상관없어 보이는 두 모듈 사이에 은밀하게 결합을 맺었다.
  • 2 현재 우리는 사용자의 이미지를 저장해야 한다고 가정한다.사용자가 로그인을 종료해야 할 때, 우리는 로컬에 저장된 그림 삭제를 이야기해야 한다.
  • 그림을 보여줄 때 로컬 파일에서 읽어야 합니다.만약 사용자가 이 때 프로그램에 로그인한다면, 우리는 사용자의 접근 데이터를 비워야 한다. 즉, 일례를 nil로 설정해야 한다.
  • 프로젝트에서 두 군데에서 세 군데 모두 액세스하는 작업이 있기 때문에 이 때 단일 조작은 반드시 라인 안전에 주의해야 한다.
  • 사실 사용자 상태를 일례로 모든 곳을 저장하는 것은 옳지 않다.하나의 예는 전체 국면의 상태만 저장하는 데 사용되며, 그 어떠한 작용역과도 연결할 수 없습니다.
  • 만약 이러한 상태의 역할 영역이 완전한 응용 프로그램의 생명 주기보다 짧다면 이 상태는 하나의 예로 관리해서는 안 된다.하나의 예로 사용자의 귀속 상태를 관리하는 것은 좋은 디자인 사고가 아니다.
  • 좋은 웹페이지 즐겨찾기