속성 메모리 관리 관련 수식자 사용 규범
간단한 소개
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 등을 수식하는데 그 구체적인 사용 장면은 본고에서 논의한 범위에 있지 않다.
보태다
속성 수식자와 대상 소유권 수식자의 대응 관계
총결산
블로그:xuyafei.cn :jianshu.com/users/2555924d8c6e 마이크로 블로그:weibo.com/xuyafei86 Github:github.com/xiaofei86
참고 자료
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.