“Nonatomic”속성은 무엇을 의미합니까?


144

이 코드에서 "비 원자"는 무엇을 의미합니까?

@property(nonatomic, retain) UITextField *theUsersName;

원자와 비원 자의 차이점은 무엇입니까?

감사


3
죄송합니다, Objective-c (cocoa)에 있음을 지정하지

이 링크를 읽어 보시기 바랍니다 - stackoverflow.com/questions/588866/...을
Vijayendra

이 글을 읽는 사람이라면 2014 년에는이 정보가 상당히 오래되었다는 것을 인식하는 것이 중요합니다. 한마디로 비원자를 사용할 이유가 없으며 어떤 이유로 든 그것을 사용하는 것은 본질적으로 잘못입니다. 고대사입니다. 비 원자 (nonatomic)는 "스레드 안전 모드 (thread unsafe mode)"를 의미하며 이제는 전혀 관련이 없습니다. 여기에 몇 가지 의견 stackoverflow.com/q/23977765/294884
Fattie

나는 "관련이없는"진술에 동의하지 않을 것입니다. 값이 거의 변경되지 않는 경우 Apple Doc의 예는 성입니다. 한 번 변경되면 원자 힌트를 사용하면 검사가 필요하지 않으므로 관련 리소스가 낭비됩니다.
Nick Turner

답변:


268

Apple Docs를 살펴보십시오 .

기본적으로이라고 nonatomic말하고을 사용하여 접근 @synthesize자를 생성 하면 여러 스레드가 속성을 한 번에 변경 / 읽으려고하면 불량이 발생할 수 있습니다. 부분적으로 작성된 값 또는 초과 릴리스 / 보존 된 오브젝트를 가져 오면 쉽게 충돌 할 수 있습니다. (그러나 이것은 원자 접근 자보다 훨씬 빠릅니다.)

기본값을 사용하는 경우 ( atomic; 키워드는 없었지만 현재 는 있음 ) @synthesized 메소드는 객체 레벨 잠금을 사용하여 단일 특성에 대한 여러 읽기 / 쓰기가 직렬화되도록합니다. Apple 문서가 지적했듯이, 이것이 전체 객체가 스레드로부터 안전하다는 것을 의미하지는 않지만 개별 속성 읽기 / 쓰기는 있습니다.

물론을 사용하지 않고 자신의 접근 @synthesize자를 구현하는 경우 이러한 선언은 속성이 스레드 안전 방식으로 구현되는지 여부에 대한 의도를 표현하는 것 외에는 아무것도하지 않는다고 생각합니다.


7
나는이 대답을 좋아합니다-다른 곳에서 발견 된 사람들보다 덜 혼란스럽고 간단하고 완벽합니다!
PapillonUK

정말 대단하고 덜 혼란 스럽지만 (+1) 왜 원자가 아닌 것보다 비원자가 잠재적으로 더 빠르다고 말할 수 있습니까?
위시

2
@Wish 비 원자 접근자는 다른 스레드가 동시에 읽기 / 쓰기를 방지하기 위해 뮤텍스를 유지하거나 CPU 시간이 드는 다른 저수준 트릭을 수행해야하므로 더 빠를 수 있습니다. 잠금을 사용하는 경우 시간이 걸리는 다른 스레드에서도 차단 될 수 있습니다.
Jesse Rusak

1
@Rob 당신은 그것에 대해 새로운 질문을 할 수 있습니다.
Jesse Rusak

1
@Pratik 죄송합니다. 맞지 않습니다. 당신이 보여주는 인용문은 내가 한 것과 똑같은 말을합니다 : 속성을 만드는 것은 atomic개별 속성에 액세스하는 동안 충돌을 피하지만 개체 전체 (예 : 성과 이름과 같은 별도의 속성에 액세스)가 수행되도록 보장 하지는 않습니다 옳은 일.
Jesse Rusak

46

많은 기사와 StackOverflow 게시물을 읽은 후 변수 속성 속성을 확인하기 위해 데모 앱을 만든 후 모든 속성 정보를 하나로 묶기로 결정했습니다.

  1. 원자 // 기본
  2. 비 원자
  3. strong = 보유 // 기본
  4. 약한 = unsafe_unretained
  5. 유지
  6. // 디폴트 할당
  7. unsafe_unretained
  8. 읽기 전용
  9. readwrite // 기본

아래는 위에서 언급 한 모든 속성을 찾을 수있는 자세한 기사 링크입니다. 여기에 최고의 답변을 해주신 모든 분들께 감사드립니다 !!

iOS의 변수 속성 또는 수정 자

  1. 원자
    • 원자는 하나의 스레드 만 변수 (정적 유형)에 액세스 함을 의미합니다.
    • 원자는 스레드 안전합니다.
    • 그러나 성능이 느립니다.
    • 원자가 기본 동작입니다.
    • 가비지 수집되지 않은 환경 (예 : retain / release / autorelease를 사용하는 경우)의 원자 접근자는 다른 스레드가 값의 올바른 설정 / 가져 오기를 방해하지 않도록 잠금을 사용합니다.
    • 실제로는 키워드가 아닙니다.

예 :

@property (retain) NSString *name;

@synthesize name;
  1. 비 원자
    • 비 원자 (nonatomic)는 다중 스레드가 변수 (동적 유형)에 액세스 함을 의미합니다.
    • 비원자는 스레드 안전하지 않습니다.
    • 그러나 성능이 빠릅니다.
    • 비원자는 기본 동작이 아닙니다. 속성 속성에 비 원자 키워드를 추가해야합니다.
    • 서로 다른 두 프로세스 (스레드)가 동시에 동일한 변수에 액세스 할 때 예기치 않은 동작이 발생할 수 있습니다.

예:

@property (nonatomic, retain) NSString *name;

@synthesize name;

12

스레드 안전성에 대해 이미 언급 한 것 외에도 원자 이외의 속성은 원자 접근 자보다 빠릅니다. 일반적으로 걱정할 필요는 없지만 명심하십시오. 이러한 이유로 Core Data 생성 속성은 부분적으로 비원 자적입니다.


9

다중 스레드 프로그램에서 원자 작업은 부분적으로 중단 될 수 없지만 비 원자 작업은 중단 될 수 있습니다.

따라서 방해를받지 않는 비 원자적인 중요한 작업이있는 경우 뮤텍스 (또는 이와 유사한 것)를 사용해야합니다.


8

"atomic"을 지정하면 생성 된 액세스 기능에 동시 업데이트를 방지하기위한 추가 코드가 있습니다.




0

"원자" 재산에 대한 액세스 스레드 안전하다는 것을. 그동안 수단 "비 원자는" 그 반대입니다. 그 합성 접근이 재산에 대한 강력한 액세스 할 수 있도록 속성이 기본적으로 원자이다 오브젝티브 C의 속성을 선언 할 때 다중 스레드 환경에서, 즉 getter에서 반환되거나 setter를 통해 설정된 값은 다른 스레드가 동시에 실행중인 항목에 관계없이 항상 완전히 검색되거나 설정됩니다. 그러나 속성을 비 원자로 선언하면 아래와 같이

@property (nonatomic, retain)  NSString *myString;

그러면 객체 속성에 대해 합성 된 접근자가 단순히 값을 직접 반환한다는 의미입니다. 비 원자 속성의 효과는 환경에 따라 다릅니다. 기본적으로 합성 된 접근자는 원자 적입니다. 따라서 비원자는 원자보다 훨씬 빠릅니다.


-2

하나는 다중 스레드입니다. 하나의 isnt


IMHO : 공감대를 얻으려면 좀 더 구체적이고 답변 작성에 시간을 투자해야합니다.
Johan Karlsson
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.