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


289

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



rypress.com/tutorials/objective-c/properties 이 모든 것이 설명되어 있습니다
Deepak Thakur

답변:


559

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


비 원자

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으로 떨어지면 여기를 가리켜도 메모리에서 할당 해제됩니다.

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


1
이 NSString을 해당 클래스 자체에서 내부적으로 사용하는 경우 속성이 필요하지 않더라도 iVar로 만들 수 있으며 다른 클래스에서 사용하는 경우 조언 (강력한, 복사) 이외의 다른 클래스에서도 사용합니다.
Ankit Srivastava

1
Assign 속성이 없습니다.
mskw

10
nonatomic여러 스레드가 동시에 액세스 해서는 안됨을 의미합니다 . 기본값은 atomic스레드 안전입니다.
wcochran

1
이 모든 시간이 지난 후에도 비 원자에 대한 정의가 여전히 틀리며 원자와 유사하다는 것은 조금 혼란 스럽습니다. 지난 5 년 동안 얼마나 많은 사람들이 이것을 사용하고 잘못된 인상을 받았는지 궁금합니다. @ wcochran이 말한 것은 맞습니다. nonatomic은 포인터에 대한 액세스가 원자 적으로 처리되지 않으므로 스레드로부터 안전하지 않음을 의미합니다. 비 원자에 대한 이해는 더 가벼운 무게라는 것입니다.
존 부쉬 넬

1
@ JohnBushnell의 의견 외에도이 답변에 많은 다른 오류와 부정확성이 있습니다. 그것은 또한 나이가 들지 않았으므로 역사적인 것입니다. 이 질문에 대한 답을 찾으면 다른 곳으로 가십시오.
CRD

45

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

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

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

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

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

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


왜 강하고, 약한, 유지, 복사, 상호 배타적 인 지정
vinoth.kumar

nonatomic제외가 적용되지 않음을 의미합니다. 액세스가 스레드로부터 안전하지 않다는 것을 의미하지는 않습니다. 그것은 atomicvs. nonatomic가 포착하지 않은 구현 세부 사항입니다 .
bbum

@bbum 제외와 스레드 안전이 아닌 차이점을 설명 할 수 있습니까?
Ankit Srivastava

1
@AnkitSrivastava 제외 는 스레드 A가 스레드 B가 코드 경로를 통과하지 못하도록 차단하는 경우입니다. 해당 코드 경로가 여러 스레드에서 실행하기에 안전한 경우 제외가 필요하지 않습니다. 스레드 안전하지 않음 은 A와 B가 동시에 다운되면 코드 경로가 정의되지 않은 결과를 낳을 수 있음을 의미합니다. 그것은 배제 를 사용하여 스레드를 안전하게 만들 수 있지만 스레드 안전에는 독점적 인 비 동시 실행이 필요하지 않습니다.
bbum

17

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

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

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

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

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

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

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

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


Assign 속성이 iVar 및 값에만 사용되지 않습니까? 그렇다면 왜 안전하지 않은지, 왜 유지되지 않았다는 점에 유의해야합니까?
mskw

9

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

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

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.