OC 소유권 수식자 및 속성 키워드
__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 obj
는 id __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;
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.