Associated 객체 연관

2071 단어
Associated Objects의 구현 원리를 참조하여 이해

일반적으로 Associated Objects는 다음 장면을 사용하는 데 사용됩니다.

  • 기존의 클래스에 사유 변수를 추가하여 세부 사항을 실현하는 데 도움을 준다.
  • 기존의 클래스에 공유 속성을 추가한다.
  • KVO에 대한 관찰자 만들기
  • 단일 객체 만들기
  • 1. 평소 창설 용 애플 홈페이지에서 제창한 글쓰기:
    static id _instance = nil;
    static dispatch_once_t once_predicate;
    + (instancetype)getUser {
        dispatch_once(&once_predicate, ^{
            _instance = [[self alloc] init];
        });
        return _instance;
    }
    

    2. 석방 사례
    /**   */
    + (void)releaseUser {
        if (_instance) { _instance = nil; once_predicate = 0;}
    }
    

    3. Associated Objects 창설 단례
    #import 
    
    @interface NSObject (Instance)
    
    + (instancetype)getInstance;
    
    /**   */
    + (void)freeInstance;
    
    @end
    
    
    
    
    *//const void *SHARED_INSTANCE_KEY = @"kSharedInstance";*
    static void *SHARED_INSTANCE_KEY = &SHARED_INSTANCE_KEY;
    
    @implementation NSObject (Instance)
    
    + (instancetype)getInstance {
        Class selfClass = [self class];
        id instance = objc_getAssociatedObject(selfClass, SHARED_INSTANCE_KEY);
        if (instance == nil) {
            instance = [[selfClass alloc] init];
            objc_setAssociatedObject(selfClass, SHARED_INSTANCE_KEY, instance, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }
        return instance;
    }
    
     /**   */
    + (void)freeInstance {
        Class selfClass = [self class];
        objc_setAssociatedObject(selfClass, SHARED_INSTANCE_KEY, nil, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }
    
    @end
    
  • objc_setAssociatedObject는 대상에 관련 대상을 추가하는 데 사용되며, 전송nil은 기존의 관련 대상을 제거할 수 있다
  • objc_getAssociatedObject연결 대상을 얻는 데 사용
  • objc_removeAssociatedObjects 객체의 모든 연관 객체를 제거하는 데 사용
  • PS:objc_removeAssociatedObjects 함수는 일반적으로 사용할 수 없습니다. 왜냐하면 이 함수는 한 대상의 모든 관련 대상을 제거하고 이 대상을'원시'상태로 복원하기 때문입니다.이렇게 하면 다른 사람이 추가한 관련 대상도 함께 제거할 가능성이 높다. 이것은 우리가 바라는 것이 아니다.그래서 일반적인 방법은 objc_setAssociatedObject 함수에 전달nil을 통해 기존의 관련 대상을 제거하는 것이다.

    좋은 웹페이지 즐겨찾기