OC 소유권 수식자 및 속성 키워드

4488 단어
ARC가 유효할 때 id 유형과 대상 유형은 소유권 수식자를 추가해야 합니다. 소유권 수식자는 모두 4가지입니다.
  • __strong 수식부.(강인용 소지 대상)
  • __weak 수식부.(약한 인용은 대상을 소지하지 않는다)
  • __unsafe_unretained수식부
  • __autoreleasing수식부
  • 그중 __strong 수식자는 id 형식과 대상 유형의 기본 소유권 수식자입니다.__strong,__weak,__autoreleasing 수식자의 자동 변수를 사용하면 nil로 초기화됩니다.메모리 유출이란 무엇입니까?메모리 유출은 폐기해야 할 대상이 생존 주기를 초과한 후에도 계속 존재하는 것을 말한다.__strong 수식자만 사용하면 순환 인용이 발생합니다.순환 참조에는
  • 상호 순환 인용, 즉 두 대상 간의 상호 강한 인용.
  • 인용으로 인한 순환 인용.
  • __weak 수식자 적용 범위: 대상 유형만 수식할 수 있고 기본 데이터 형식에는 사용할 수 없습니다.__weak 수식부적의 장점: 1.순환 인용으로 인한 메모리 유출을 피할 수 있습니다.약한 인용은 대상을 가지고 있지 않기 때문이다.2. 대상의 약한 인용을 가지고 있을 때 대상이 폐기되면 이 약한 인용은 자동으로 효력을 상실하고 바늘 변수는 nil로 부여됩니다.__weak 수식자는 iOS5 및 그 이상에만 사용할 수 있고, iOS4에서는 __unsafe_unretained로만 대체할 수 있습니다.하지만 지금은 최저 버전인 iOS7이 되었으니 안심하고 사용할 수 있다__weak 수식자.__weak 수식부적 단점: 1.__weak 수식자의 바늘 변수가 부착되어 있기 때문에 지향하는 대상이 소각될 때 시스템은 이 대상의 모든__weak 바늘을nil로 설정하기 때문에 효율__unsafe_unretained 수식자에 비해 낮다.때로는 장점도 단점이다.네가 어떻게 도를 잘 파악하느냐에 달려 있다.2. 기본 데이터 형식에 사용할 수 없습니다.__unsafe_unretained 수식자 적용 범위: 기본 데이터 형식에도 사용할 수 있고 대상 형식에도 사용할 수 있습니다.__unsafe_unretained 수식자가 첨부된 변수도 보유 대상이 될 수 없습니다.단점: __weak 수식자와 달리 __unsafe_unretained 수식자의 변수가 가리키는 대상이 폐기되면 이 바늘 변수의 값은nil로 설정되지 않고 여전히 이전의 값이다.하지만 그것은 이미 야생 지침이 되어 다시 방문하면 붕괴될 것이다. 매번 붕괴되는 것은 아니지만.__autoreleasing 수식자 ARC가 유효할 때 대상에 부착된 __autoreleasing 수식자의 바늘 변수는 ARC가 무효일 때 대상을 호출하는 autorelease 방법과 같고 대상을 autoreleasepool에 등록합니다.그러나 현식적으로 추가__autoreleasing수식부호는 현식__strong수식부호와 마찬가지로 보기 드물다.컴파일러가 우리를 도와 추가할 수 있기 때문이다.예를 들어 alloc를 사용하면.../처음 이외의 방법으로 얻은 대상은 이미 autoreleasepool에 등록된 것이다(ARC에서 되돌아올 대상이 반드시 autoreleasepool에 등록된 것은 아니지만, 여기서는 잠시 이렇게 이해한다).이것은 컴파일러가 방법 이름이 alloc로 되어 있는지 확인하기 때문입니다.../처음에, 그렇지 않으면 자동으로 되돌아오는 값의 대상으로 autoreleasepool에 등록합니다.예를 들어 ARC가 유효할 때 다음과 같은 방법이 있습니다.
    + (id)array
    
    {
    
       id obj = [[NSMutableArray alloc] init];
    
       return obj;
    
    }
    

    명시적인 지정 소유권 수식자가 없기 때문에 id objid __strong obj와 같다.return은 대상 변수를 작용역을 초과하기 때문에, 이 강력한 인용 바늘 변수가 가리키는 대상은 방출되지만, 이 대상은 함수의 반환값으로 컴파일러는 자동으로 autoreleasepool에 등록합니다.여기에도 표시된 부가 __autoreleasing 수식자를 사용하지 않았다.또 다른 표시 없이 사용할 수 있는 수식자__autoreleasing의 경우 id의 바늘이나 대상의 바늘(즉 이중 바늘)은 지정이 표시되지 않을 때__autoreleasing 수식자가 추가된다.가장 일반적인 예는 NSError 오류를 검색하는 경우입니다.NSError *err = nil; Bool result = [obj performOperationWithError:&err]; 이 방법의 성명은 다음과 같다. - (BOOL)performOperationWithError:(NSError **)error;상술한 방법 성명은 - (BOOL)performOperationWithError:(NSError * __autoreleasing *)error;과 같다
    다시 한 번 말하지만 alloc/new/copy/mutable Copy 방법으로 값을 되돌려 얻은 대상은 자신이 생성하고 보유한 것이고 다른 상황에서는 자신이 생성하고 보유하지 않은 대상을 얻는다.따라서 __autoreleasing 수식자가 첨부된 변수를 대상으로 매개 변수를 얻고alloc/new/copy/mutable Copy를 제외한 다른 방법의 반환값 획득 대상과 똑같이autoreleasepool에 등록하여 자신이 생성하고 보유하지 않은 대상을 얻는다.
    마지막으로 대상에게 포인터를 부여할 때 소유권 수식자는 일치해야 한다.따라서 아래의 원본 코드는 컴파일러 오류가 발생할 수 있습니다: NSError *err = nil; NSError **p = &err; 변경이 필요합니다: NSError *err = nil; NSError * __strong *p = &err; 그런데 아래의 이런 상황은 어떻게 된 것입니까?NSError *err = nil; __strong . __autoreleasing . NSError *err = nil; Bool result = [obj performOperationWithError:&err];
    이 방법의 성명은 다음과 같다. - (BOOL)performOperationWithError:(NSError **)error;실제로 컴파일러가 자동으로 상기 원본 코드를 변환했다: NSError __strong *error = nil; NSError __autoreleasing *tmp = error; BOOL result = [obj performOperationWithError:&tmp]; error = tmp;속성 키워드: 속성 키워드는 다음과 같습니다.assign 대응__unsafe_unretained 수식부2.copy 대응__strong 수식자(하지만 값은 복사된 대상) MRC는 3.retain 대응__strong 수식자는 ARC가 유효할 때에도 사용할 수 있습니다.4.strong 기본 대응__strong 수식자 5.unsafe_unretained 대응__unsafe_unretained 수식자 6.weak대응__weak수식부7.atomic 기본 8.nonatomic 9.readonly 10.readwrite에서 기본적으로 주의해야 할 것은 속성의 키워드가 실례 변수의 수식자와 일치해야 한다는 것이다. (시스템이 만들어준 실례 변수를 사용하지 않을 때)
    @interface ViewController ()
    
    {
    
        __autoreleasing NSString *_ttrsr;
    
    }
    
    @property (nonatomic, strong) NSString *ttrsr;
    
    @end
    

    이렇게 쓰면 잘못 보고할 수 있다.필요__strong NSString *_ttrsr; 또는 NSString *_ttrsr;

    좋은 웹페이지 즐겨찾기