[objective-c] Objective-C가 @property 속성을 선언했습니다 (비 원자, 복사, 강, 약)

: 나는 각 속성을 사용해야 할 때 누군가가 구체적으로 나에게 설명 할 수 nonatomic, copy, strong, weak, 등에 선언 된 속성에 대해 각각이 무엇을 설명? 어떤 종류의 예도 좋습니다. ARC를 사용하고 있습니다.



답변

이 답변에는 많은 오류가 있으며 구식입니다. 다른 질문 / 응답 및 의견을 참조하십시오.


비 원자

nonatomic멀티 스레딩 목적으로 사용됩니다. 선언시 nonatomic 속성을 설정하면 해당 객체에 액세스하려는 다른 스레드가 액세스하여 멀티 스레딩과 관련하여 결과를 제공 할 수 있습니다.

copy객체가 변경 가능할 때 필요합니다. 이 시점에서 객체의 값이 필요하고 해당 값이 객체의 다른 소유자가 변경 한 내용을 반영하지 않게하려면이 옵션을 사용하십시오. 사본을 보유하고 있으므로 오브젝트를 완료하면 오브젝트를 해제해야합니다.

양수인

Assign다소 반대 copy입니다. assign속성 의 getter를 호출하면 실제 데이터에 대한 참조를 반환합니다. 일반적으로 기본 유형 (float, int, BOOL …)의 특성이있는 경우이 속성을 사용합니다.

유지

retain속성이 객체에 대한 포인터 인 경우 필수입니다. 에 의해 생성 된 setter @synthesize는 객체를 유지 (일명 유지 횟수 추가)합니다. 작업이 끝나면 개체를 해제해야합니다. retain을 사용하면 자동 릴리스 풀에서 보유 수와 메모리를 차지합니다.

강한

strongObjective-C ARC (Automated Reference Counting)의 일부로 보유 속성을 대체합니다. ARC가 아닌 코드에서는 유지와 동의어 일뿐입니다.

이에 대해 배울 수있는 좋은 웹 사이트입니다 strongweak아이폰 OS (5)에 대한
http://www.raywenderlich.com/5677/beginning-arc-in-ios-5-part-1

약한

weakstrong참조 횟수를 1 씩 늘리지 않는다는 점 을 제외하고 는 비슷 합니다. 객체의 소유자가 아니라 참조 만 보유합니다. 객체의 참조 카운트가 0으로 떨어지면 여기를 가리켜도 메모리에서 할당 해제됩니다.

위 링크에는 약함과 강함 에 관한 좋은 정보가 있습니다.


답변

nonatomic property는 객체가 스레드로부터 안전하지 않다는 것을 나타냅니다. 즉, 다른 스레드가이 객체에 액세스하려고하면 나쁜 일이 발생할 수 있지만 원자 속성보다 훨씬 빠릅니다.

strong는 ARC와 함께 사용되며 기본적으로 객체의 보유 횟수에 대해 걱정할 필요가 없으므로 도움이됩니다. ARC는 작업을 마치면 자동으로 해제하므로 키워드 strong를 사용하면 객체를 소유 한 것입니다.

weak소유권은 자신이 소유하지 않음을 의미하며 객체가 할당 될 때까지 객체를 추적합니다. 두 번째 객체가 해제 되 자마자 손실됩니다. 예를 들어. obj.a=objectB;objectB가 메모리에 남아있을 때까지만 해당 값이 사용되는 것보다 a가 사용되고 약한 property가 있습니다.

copy재산은 여기에설명되어 있습니다

strong,weak,retain,copy,assign상호 배타적이므로 하나의 단일 객체에서 사용할 수 없습니다. “선언 된 속성” 섹션을 읽으십시오

이것이 도움이되기를 바랍니다.


답변

이 링크에는 고장이 있습니다

http://clang.llvm.org/docs/AutomaticReferenceCounting.html#ownership.spelling.property

assign은 __unsafe_unretained 소유권을 의미합니다.

copy는 __strong 소유권과 setter에서 일반적인 copy 의미 론적 동작을 의미합니다.

유지는 __strong 소유권을 의미합니다.

strong은 __strong 소유권을 의미합니다.

unsafe_unretained는 __unsafe_unretained 소유권을 의미합니다.

약한 것은 __ 약한 소유권을 의미합니다.


답변

좋은 답변입니다! 더 자세히 설명하고 싶은 것은 nonatomic/ atomic입니다. 사용자는이 속성- “원 자성”이 속성의 내용이 아니라 속성의 참조로만 퍼짐을 이해해야합니다. 즉 atomic, 포인터를 읽고 / 설정하고 속성에 대한 포인터 만 사용자 원 자성을 보장합니다. 예를 들면 다음과 같습니다.

@interface MyClass: NSObject
@property (atomic, strong) NSDictionary *dict;
...

이 경우에 대한 포인터 dict는 다른 스레드에 의해 원자 방식으로 읽히고 설정됩니다. 그러나 dict자체 (사전을 dict가리키는 사전 )는 여전히 스레드 안전하지 않습니다 . 즉, 사전에 대한 모든 읽기 / 추가 작업은 여전히 ​​스레드 안전하지 않습니다.

스레드 안전 수집이 필요한 경우 잘못된 아키텍처 (자주) 또는 실제 요구 사항 (더 드문)이 있습니다. 그것이 “실제 요구 사항”이라면-당신은 좋은 & 스레드 안전 수집 구성 요소를 찾거나 자신의 하나를 작성하는 시련과 환난을 준비해야합니다. 후자의 경우는 “자유없는”, “대기없는”패러다임을 살펴 봅니다. 언뜻보기에 로켓 과학처럼 보이지만 “일반 잠금”과 비교하여 환상적인 성능을 달성하는 데 도움이 될 수 있습니다.


답변