속성 메모리 관리 관련 수식자 사용 규범

6452 단어

간단한 소개

  • strong/retain: 객체만 손질할 수 있습니다.소지 대상.양자 등가.
  • assign/unsafe_unretained: 기본 데이터 형식만 수식하는 것이 좋습니다.객체를 손질할 때 객체가 없습니다.객체가 제거되면 속성 값이 자동으로 비워지지 않아 드롭 포인터가 발생합니다.양자 등가.
  • weak: 객체만 손질할 수 있습니다.소지 대상 없음.객체가 제거되면 속성 값이 자동으로 비워집니다.
  • copy: 객체만 손질할 수 있습니다.strong과 유사하지만, 값을 부여한 것은 복사된 대상입니다.

  • strong/retain


    어의를 수식하다


    이 특성은 이 속성이 일종의'소유 관계'(owning relationship)를 정의했음을 나타낸다.이 속성에 새 값을 설정할 때, 설정 방법은 먼저 새 값을 보존하고, 낡은 값을 방출한 다음에 새 값을 설정합니다.
    - (void)setObject:(id)object {
        [object retain];
        [_object release];
        _object = object;
    }
    

    코스메틱 제한


    객체 유형만 손질할 수 있습니다.'기본 데이터 형식' 을 수식하는 데 사용하면 컴파일러가 오류를 보냅니다.'retain이나strong 특질을 가진 속성은 대상 형식이어야 합니다. '기본 데이터 형식에 인용 계수가 없기 때문에 컴파일러가 인용 계수를 관리하는 코드를 삽입할 수 없기 때문이다.
    Property with 'retain (or strong)' attribute must be of object type
    

    구별하다


    양자는 완전히 등가이다.그러나 스트롱은 iOS5에 따라 ARC를 도입할 때 추가된 새로운 특성이기 때문에 MRC 환경에서(-fno-objc-arc)는retain으로만 수식할 수 있다.ARC 환경에서는 MRC와 구분하고 위크와 대응하기 위해 스트롱을 사용하는 것이 좋다.

    assign/unsafe_unretained


    어의를 수식하다


    이 특성은 이 속성이'비소유 관계'(nononowning relationship)를 정의했음을 나타낸다.이 속성에 새 값을 설정할 때, 설정 방법은 새 값을 보류하지도 않고, 낡은 값을 방출하지도 않는다.

    코스메틱 제한


    가장 좋은 것은'기초 데이터 형식'을 수식하는 데 쓰인다.객체 유형을 코스메틱화하면 대상 객체가 손상될 때 속성 값이 자동으로 비워지지 않아 포인터가 드리워집니다.인용된 메모리가 회수되었는지 확인할 수 없기 때문에 이 속성에 다시 접근하는 것은 안전하지 않습니다.

    구별하다


    weak은 iOS5가 ARC를 도입함에 따라 추가된 새로운 기능이다.이전에 assign은 일반적으로'기초 데이터 형식',unsafe 에만 사용되었다.UNretained는 주로 ARC 아래의 weak에 대응하는 객체 유형에 사용됩니다.실제로 ARC식 메모리 관리는 컴파일러의 작업임에도 불구하고 unsafeunretained 수식자의 변수는 컴파일러의 메모리 관리 대상에 속하지 않습니다.그래서 unsaferetained 수식'기초 데이터 형식'은 오류를 보고하지 않으며 실제 사용 시 assign과 완전 등가입니다.
    자동 비우기(weak가 갖춰진 특질)는 ARC에 따라 도입된 새로운 특성으로 운행기 시스템에 의해 이루어진다.MRC 시대의 운영 체제(objective-C 실행 시 라이브러리 493.9 이하)는 자동으로 비울 수 없기 때문에 약한 인용으로 수식 대상을 만드는 것은 안전하지 않다.따라서 assign의 의미와 같은 unsafe 가 나타난다개발자에게 대상을 수식하는 것이 안전하지 않다는 것을 알리는 표시 역할을 합니다.그뿐이야.
    MRC 환경(-fno-objc-arc)에서도 이런 규칙을 따라 사용해야 한다.ARC 환경에서 assign/unsafeunretained는 '대상 유형' 을 수식하는 데 사용하지 말고, 더 안전한 weak을 사용해야 합니다.사실, weak이 도입된 후, unsafeunretained는 사용의 의미를 잃었습니다.'대상 유형' 을 수식할 때, 우리는 더욱 안전한 weak을 가지고 있다.'기초 데이터 유형'을 수식할 때도 unsafe라는 의미와 MRC의 사용 습관에 맞지 않는다.하지만 unsafeunretained는 ARC에서도 장면을 사용합니다.C 언어 구조체에 대상을 추가하려면 unsafeunretained 수식(또는'void*'로 강제 변환)

    weak


    어의를 수식하다


    이 특질이 표현하는 소속 관계와 assign/unsafeunretained는 유사합니다.그러나 속성이 가리키는 대상이 파괴되었을 때 속성 값도 비워집니다 (nil out).
    weak 수식자가 첨부된 변수를 사용하면 자동적으로 autoreleasepool에 등록됩니다.weak 코스메틱 변수를 많이 사용하면 해당 CPU 자원이 소모됩니다.좋은 방법은 순환 인용을 피할 때만 weak을 사용하는 것이다.다음 소스 코드는 weak 수식자가 첨부된 변수를 5번 사용했습니다.이에 따라 변수 o가 부여한 값의 대상도 autoreleasepool에 5회 등록된다.
    id __weak o = obj;
    NSLog(@"1 %@", o);
    NSLog(@"2 %@", o);
    NSLog(@"3 %@", o);
    NSLog(@"4 %@", o);
    NSLog(@"5 %@", o);
    

    첨부weak 수식자의 변수 o 부여strong 수식자의 변수를 사용한 후에 사용하면 이런 문제를 피할 수 있습니다.tmp = o;대상은 autoreleasepool에 한 번만 등록됩니다.
    id __weak o = obj;
    id tmp = o;
    NSLog(@"1 %@", tmp);
    NSLog(@"2 %@", tmp);
    NSLog(@"3 %@", tmp);
    NSLog(@"4 %@", tmp);
    NSLog(@"5 %@", tmp);
    

    코스메틱 제한


    객체 유형만 손질할 수 있습니다.'기본 데이터 형식' 을 수식하는 데 사용하면 컴파일러가 "weak 특질을 가진 속성은 대상 형식이어야 합니다."라고 오류를 보냅니다.이것은 '기본 데이터 형식' 이 자동으로 비워지지 않기 때문입니다. (nil로 설정할 수 없습니다.)
    Property with 'weak' attribute must be of object type
    

    구별하다


    weak은 iOS5가 ARC를 도입할 때 추가된 새로운 기능으로 MRC 환경(-fno-objc-arc)에서 unsafeunretained로 수식해 주세요.weak 인용은 자동으로 비울 수도 있고, 자동으로 비우지 않을 수도 있습니다.자동 비우기(autonilling)는 ARC에 따라 도입된 새로운 기능으로 운행기 시스템에 의해 이루어진다.자동 비우기 기능을 갖춘 약한 인용에서 데이터를 마음대로 읽을 수 있다. 왜냐하면 이 인용은 이미 회수한 메모리를 가리키지 않기 때문이다.그래서 assign/unsafe보다...unretained, weak을safe 로 이해할 수 있습니다unretained.
    *실제로 weak 수식자를 지원하지 않는 대상이 존재합니다.예를 들어 NSMachPort 클래스의 대상,allowsWeakRefrence/reatinWeakRefrence 실례 방법(NSObject 인터페이스 설명 문서에 쓰지 않았음)이 NO의 대상을 되돌려준다.이것은 본문의 토론 범위에 있지 않다.

    copy


    어의를 수식하다


    이 특질이 표현하는 소속 관계는strong/retain과 유사하다.그러나 설정 방법은 새 값을 유지하지 않고 복사합니다.

    코스메틱 제한


    객체 유형만 손질할 수 있습니다."기본 데이터 형식"을 수식하는 데 사용하면 컴파일러가 "코피 특질이 있는 속성은 대상 형식이어야 합니다"라고 오류를 보냅니다.기본 데이터 형식에 인용 계수가 없기 때문에 컴파일러가 인용 계수를 관리하는 코드를 삽입할 수 없기 때문이다.
    Property with 'copy' attribute must be of object type
    

    *copy는 주로 블록, NSString 등을 수식하는데 그 구체적인 사용 장면은 본고에서 논의한 범위에 있지 않다.

    보태다


    속성 수식자와 대상 소유권 수식자의 대응 관계
  • strong:__strong 수식자
  • retain:__strong 수식자
  • assign:__unsafe_unretained 수정자
  • unsafe_unretained:__unsafe_unretained 수정자
  • weak:__weak 수식자
  • copy:__strong 수식자 (그러나 부여된 값은 복사된 대상)
  • 관련 대상 중 메모리 관리와 관련된 수식자의 대응 관계
  • OBJC_ASSOCIATION_ASSIGN:@property (assign)/@property(unsafe_unretained)
  • OBJC_ASSOCIATION_RETAIN_NONATOMIC:@property (nonatomic, strong)
  • OBJC_ASSOCIATION_COPY_NONATOMIC:@property (nonatomic, copy)
  • OBJC_ASSOCIATION_RETAIN:@property (atomic, strong)
  • OBJC_ASSOCIATION_COPY:@property (atomic, copy)

  • 총결산

  • retain 및 unsafeunretained는 모두 MRC 시대의 수식부호로 ARC가 도입한 strong과 weak에 대응한다.ARC 환경에서 더 이상 사용하지 마십시오.
  • strong과 weak은 ARC 환경에서 사용해야 할 수식부호이다.코스메틱 객체가 있는 경우, 코스메틱 객체가 없는 경우 베이스 데이터 유형을 코스메틱화할 수 없으며 자동으로 비워집니다.
  • assign은 어떠한 환경에서든'기초 데이터 형식'('대상 유형'을 수식할 수 있음)을 수식해야 하며 보유 여부의 의미가 없다.
  • copy는 대상을 복사하고 구체적인 사용 장면은 본고의 토론 범위에 있지 않다.

  • 블로그:xuyafei.cn :jianshu.com/users/2555924d8c6e 마이크로 블로그:weibo.com/xuyafei86 Github:github.com/xiaofei86

    참고 자료

  • [iOS Developer Libiary] Practical Memory Management
  • [Objective-C 고급 프로그래밍] 제1장 자동 인용 계수
  • [Effective Objective-C 2.0] 제5장 메모리 관리
  • [Stack Ovewflow] Should I use copy or strong with arrays?
  • [Stack Ovewflow] Objective-C ARC: strong vs retain and weak vs assign
  • [Stack Ovewflow] Unsafe_unretain Vs Weak VS Assign
  • [Quora] What is the difference between strong, retain, nonatomic, etc., in the Objective-C (iOS) property?
  • [] 수많은 사람들이 쓴 assign,retain,strong,weak,unsafeunretained, 그리고copy
  • [CSDN] copy,retain,assign,readonly,readwrite,strong,weak,nonatomic 정리
  • 좋은 웹페이지 즐겨찾기