ios - 포맷 - 하이 시에라 장점




원자 적 특성과 비 원자 적 특성의 차이점은 무엇입니까? (18)

원자 (기본값)

Atomic이 기본값입니다. 아무 것도 입력하지 않으면 속성이 원자 적입니다. 원자 속성을 사용하면 해당 값을 읽으려고하면 유효한 값이 반환됩니다. 그 가치가 무엇인지에 대한 어떤 보증도하지 않지만, 단지 정크 메모리가 아닌 좋은 데이터를 얻을 것입니다. 이를 통해 하나의 변수를 가리키는 여러 스레드 또는 여러 프로세스가 있고 하나의 스레드는 읽을 수 있고 다른 스레드는 쓸 수 있습니다. 같은 시간에 히트 한 경우, 리더 스레드는 변경 전이나 변경 후에 두 값 중 하나를 가져올 수 있습니다. 어떤 원자는 당신이 얻을 수있는 가치에 대해 어떤 종류의 보증도하지 않습니다. Atomic은 스레드로부터 안전하다는 것과 실제로 일반적으로 혼동되며 그 것은 정확하지 않습니다. 스레드 안전성을 다른 방법으로 보장해야합니다. 그러나 원자는 여러분이 읽으 려한다면 어떤 종류의 가치를 되 찾을 것을 보장 할 것입니다.

비 원자성의

플립 측면에서 비 원자력은 아마 추측 할 수 있듯이 "원자력적인 것"을 의미하지 않는다. 당신이 잃는 것은 당신이 항상 뭔가를 돌려 준다는 보장이다. 쓰기 도중에 읽으려고하면 가비지 데이터를 다시 가져올 수 있습니다. 그러나, 반면에, 당신은 조금 더 빨리갑니다. 원자 속성은 값을 되 찾을 수 있도록하기 위해 마술을해야하기 때문에 조금 느립니다. 그것이 당신이 많이 접근하고있는 속성이라면, 속도가 떨어지지 않도록 비 구조적으로 드롭 다운 할 수 있습니다.

자세한 내용은 여기를 참조하십시오 : https://realm.io/news/tmi-objective-c-property-attributes/

속성 선언에서 atomicnonatomic 평균은 무엇입니까?

@property(nonatomic, retain) UITextField *userName;
@property(atomic, retain) UITextField *userName;
@property(retain) UITextField *userName;

이 세 가지 운영상의 차이점은 무엇입니까?


원자 :

Atomic은 속성에 대한 액세스가 원자 적 방식으로 수행됨을 보장합니다. 예를 들어 항상 완전히 초기화 된 객체를 반환하면 하나의 스레드에서 속성의 get / set을 완료해야만 다른 스레드가 액세스 할 수 있습니다.

한 번에 두 개의 스레드에서 발생하는 다음 함수가 상상해 보면 왜 결과가 좋지 않은지 알 수 있습니다.

-(void) setName:(NSString*)string
{
  if (name)
  {
    [name release]; 
    // what happens if the second thread jumps in now !?
    // name may be deleted, but our 'name' variable is still set!
    name = nil;
  }

  ...
}

장점 : 매번 초기화 된 객체가 반환되면 멀티 스레딩의 경우 최상의 선택이됩니다.

단점 : 성능 저하로 인해 실행 속도가 약간 느려집니다.

비 원자력 :

Atomic과는 달리 매번 초기화 된 객체가 매번 반환되는 것은 아닙니다.

장점 : 매우 빠른 실행.

단점 : 멀티 스레딩의 경우 쓰레기 값의 가능성.


@property의 속성에 대해 논의하기 전에 @property의 사용법을 알아야합니다. @property는 클래스가 캡슐화하려는 정보를 정의하는 방법을 제공합니다. @property를 사용하여 객체 / 변수를 선언하면 해당 객체 / 변수는 해당 클래스를 가져 오는 다른 클래스에서 액세스 할 수 있습니다. 헤더 파일에서 @property를 사용하여 객체를 선언하면 구현 파일에서 @synthesize를 사용하여 객체를 합성해야합니다.

예:

.h 클래스

@interface ExampleClass : NSObject
   @property (nonatomic, retain) NSString *name;
@end

.m 클래스

@implementation ExampleClass
   @synthesize name;
@end

이제 컴파일러는 name에 접근 자 메서드를 합성합니다.

ExampleClass *newObject=[[ExampleClass alloc]init];
NSString *name1=[newObject name]; // get 'name'
[obj setName:@“Tiger”];

@property의 속성 목록 : atomic. 비 원자. 유지하다. 부. 읽기 전용. readwrite. 양수인. 강한.

atomic : 기본 동작입니다. 오브젝트가 원자 적으로 선언되면 스레드로부터 안전 해집니다. thread-safe는, 그 클래스의 특정의 인스턴스의 1 개의 thread 만, 그 객체에 대한 제어를 가질 수있는 것을 의미합니다.

예 :

@property NSString *name; //by default atomic
@property (atomic)NSString *name; // explicitly declared atomic

nonatomic : 스레드로부터 안전하지 않습니다. 비 원자 속성 속성을 사용하여 합성 된 접근자가 단순히 값을 직접 설정하거나 반환하도록 지정할 수 있습니다.이 경우 동일한 값이 다른 스레드에서 동시에 액세스되는 경우 어떤 일이 발생하는지 보장하지 않습니다. 이러한 이유로 원자가 아닌 속성에 액세스하는 것이 더 빠릅니다. @property (nonatomic)NSString *name;

retain : 속성이 객체에 대한 포인터 인 경우 필요합니다. setter 메소드는 객체의 보유 개수를 늘려 autorelease 풀에서 메모리를 차지하도록합니다. @property (retain)NSString *name;

copy : copy를 사용하면 retain을 사용할 수 없습니다. 클래스의 사본 인스턴스 사용에는 자체 사본이 포함됩니다. 변경 가능한 문자열이 설정되고 나중에 변경되는 경우에도 인스턴스는 설정된 시점의 값을 캡처합니다. setter 및 getter 메소드는 합성되지 않습니다.

@property (copy) NSString *name;

NSMutableString *nameString = [NSMutableString stringWithString:@"Liza"];    
xyzObj.name = nameString;    
[nameString appendString:@"Pizza"];

readonly : setter 메서드를 통해 속성을 변경할 수 없도록하려는 경우 속성을 읽기 전용으로 선언 할 수 있습니다. @property (readonly) NSString *name;

readwrite :는 기본 동작입니다. readwrite 특성을 명시 적으로 지정할 필요가 없습니다.

@property (readwrite) NSString *name;

assign : 값을 복사하거나 유지하는 대신 인스턴스 변수에 직접 지정하는 설정기를 생성합니다. 이것은 NSInteger 및 CGFloat와 같은 기본 유형 또는 직접 소유하지 않은 객체 (예 : 대리자)에 가장 적합합니다.

@property (assign) NSInteger year;

strong : 보유를 대신합니다. @property (nonatomic, strong) AVPlayer *player;

unsafe_unretained : 약한 참조를 지원하지 않는 Cocoa 및 Cocoa Touch의 클래스가 있습니다. 약한 속성이나 약한 지역 변수를 추적 할 수 없다는 것을 의미합니다. 이 클래스에는 NSTextView, NSFont 및 NSColorSpace 등이 포함됩니다. 이 클래스 중 하나에 약한 참조를 사용해야하는 경우 안전하지 않은 참조를 사용해야합니다. 안전하지 않은 참조는 관련 객체를 활성 상태로 유지하지 않는다는 점에서 약한 참조와 유사하지만 대상 객체가 할당 해제되면 nil로 설정되지 않습니다.

@property (unsafe_unretained) NSObject *unsafeProperty;


Atomic은 하나의 스레드 만 변수 (정적 유형)에 액세스한다는 것을 의미합니다. Atomic은 스레드로부터 안전하지만 느립니다.

Nonatomic은 여러 스레드가 변수 (동적 유형)에 액세스한다는 의미입니다. 비 원자력은 스레드가 안전하지 않지만 빠릅니다.


가장 쉬운 대답 1 번 : 두 번째 두 가지 예가 차이가 없습니다. 기본적으로 속성 접근자는 원자 적입니다.

가비지 수집되지 않은 환경의 원자 접근 자 (예 : retain / release / autorelease를 사용하는 경우)는 다른 스레드가 올바른 설정 / 값 가져 오기를 방해하지 않도록 잠금을 사용합니다.

멀티 스레드 응용 프로그램을 만들 때 더 많은 정보와 기타 고려 사항은 Apple Objective-C 2.0 문서의 " 성능 및 스레딩 "섹션을 참조하십시오.


구문과 의미는 이미이 질문에 대한 다른 훌륭한 대답에 의해 잘 정의되어 있습니다. 실행성능 이 잘 설명되지 않았으므로 필자의 답을 추가 할 것입니다.

이 3의 기능상의 차이점은 무엇입니까?

나는 항상 원자가를 매우 기묘한 것으로 생각했다. 우리가 작업하는 추상화 수준에서, 클래스로 원자 속성을 사용하여 100 % 스레드 안전성을 달성 할 수있는 방법을 모범 사례로합니다. 진정으로 올바른 다중 스레드 프로그램의 경우, 프로그래머의 개입은 거의 확실한 요구 사항입니다. 한편, 성능 특성 및 실행에 대한 자세한 내용은 아직 자세하지 않습니다. 몇 년 동안 무겁게 멀티 스레드 된 프로그램을 작성하면서 nonatomic 가 어떤 목적을 위해 합리적이지 않았기 때문에 내 속성을 전체적으로 nonatomic 으로 선언했습니다. 원자 및 비 원자 속성의 세부 사항에 대한 토론 에서이 질문에 대해 몇 가지 프로파일 링을 수행하여 흥미로운 결과를 얻었습니다.

실행

승인. 가장 먼저 정리하고 싶은 것은 잠금 구현이 구현 정의되고 추상화 된 것입니다. 루이는 자신의 예에서 @synchronized(self) 를 사용합니다. 저는 이것을 일반적인 혼란의 근원으로 보았습니다. 구현은 실제로 @synchronized(self) 사용하지 않습니다. 객체 레벨 스핀 잠금을 사용합니다. 루이의 그림은 우리 모두가 친숙한 구조를 사용하여 높은 수준의 일러스트레이션에 좋지만 @synchronized(self) 사용하지 않는다는 것을 아는 것이 중요합니다.

또 다른 차이점은 원자 속성이 getter 내에서 객체를 유지 / 해제 할 수 있다는 점입니다.

공연

흥미로운 부분은 다음과 같습니다. 비경쟁 (예 : 단일 스레드) 경우에 원자 속성 액세스를 사용하는 성능은 경우에 따라 매우 빠를 수 있습니다. 이상적인 경우가 아닌 경우 원자 접근의 사용은 nonatomic 의 오버 헤드보다 20 배 이상 nonatomic . 7 스레드를 사용하는 Contested 케이스는 3 바이트 구조체 (2.2GHz Core i7 쿼드 코어, x86_64)의 경우 44 배 더 느립니다. 3 바이트 구조체는 매우 느린 속성의 예입니다.

흥미로운 측면 노트 : 3 바이트 구조체의 사용자 정의 접근자는 합성 된 원자 접근 자보다 52 배 빠릅니다. 또는 합성 비 원자 접근 자의 속도는 84 %입니다.

논쟁의 여지가있는 사물도 50 회를 초과 할 수 있습니다.

최적화의 수와 구현의 다양성으로 인해 이러한 상황에서 실제 영향을 측정하는 것은 매우 어렵습니다. "프로필을 작성하고 문제가 있다는 것을 발견하지 않는 한 신뢰할 수 있습니다."와 같은 소리가 자주 들릴 수 있습니다. 추상화 수준으로 인해 실제로 실제 영향을 측정하는 것은 실제로 어렵습니다. 프로필에서 실제 비용을 모으는 것은 매우 시간이 많이 걸릴 수 있으며 추상화로 인해 상당히 부정확 할 수 있습니다. ARC와 MRC는 큰 차이를 만들 수 있습니다.

objc_msgSend 속성 액세스 구현에 초점을 두지 않고 뒤로 objc_msgSend 와 같은 일반적인 용의자를 포함시키고 논쟁의 여지가없는 경우 (초 단위의 값) NSString getter에 대한 많은 호출의 실제 결과를 조사합니다.

  • MRC | 비 원자 | 수동으로 구현 된 getters : 2
  • MRC | 비 원자 | 합성 게터 : 7
  • MRC | 원자 | 합성 게터 : 47
  • 아크 | 비 원자 | 합성 게터 : 38 (주 : ARC가 여기에서 참조 횟수 순환을 추가 함)
  • 아크 | 원자 | 합성 게터 : 47

아마 추측 할 수 있듯이 참조 횟수 활동 / 순환은 원자 단위 및 ARC에서 중요한 기여를합니다. 당신은 또한 논쟁의 여지가있는 경우에 더 큰 차이를 보게 될 것입니다.

퍼포먼스에 세심한주의를 기울이지 만, 나는 여전히 시맨틱 스 (Semantics First) 라고 말합니다 ! . 그 사이에, 성과는 많은 프로젝트를위한 낮은 우선권이다. 그러나 사용하는 기술의 실행 세부 사항과 비용을 아는 것은 확실하지 않습니다. 당신은 당신의 필요, 목적 및 능력에 맞는 기술을 사용해야합니다. 다행히도 몇 시간을 비교할 필요가 없기 때문에 프로그램을 설계 할 때보다 정확한 정보에 근거한 결정을 내릴 수 있습니다.


마지막 두 개는 동일합니다. "원자"는 기본 동작입니다 ( 실제로는 키워드가 아니며 nonatomic atomic 없음으로 만 지정됩니다 - atomic 는 최근 버전의 llvm / clang에서 키워드로 추가되었습니다).

메소드 구현을 @synthesizing한다고 가정 할 때, 원자 대 비 원자가 생성 된 코드를 변경합니다. 자신의 setter / getter를 작성하는 경우 원자 / 비 원자 / 유지 / 할당 / 복사는 단지 자문입니다. (참고 : @synthesize는 최신 버전의 LLVM에서 기본 동작으로 인스턴스 변수를 선언 할 필요가 없으며 실수로 직접 액세스하는 것을 방지하기 위해 자동으로 합성되어 _ 앞에 이름이 추가됩니다).

"원자"를 사용하면 합성 된 setter / getter는 다른 스레드의 setter 활동에 관계없이 setter에 의해 getter 또는 setter에서 항상 전체 값이 반환되도록합니다. 즉, 스레드 B가 setter를 호출하는 동안 스레드 A가 getter의 중간에 있으면 실제 실행 가능 값인 자동 렌더링 된 객체가 A의 호출자에게 반환됩니다.

nonatomic 에서는 그러한 보증이 이루어지지 않습니다. 따라서 nonatomic 원자가 "원자"보다 훨씬 빠릅니다.

"원자"가하지 않는 것은 스레드의 안전성을 보장하는 것입니다. thread A가 thread B와 동시에 getter를 호출하고, C가 setter를 다른 값으로 호출하면, thread A는 반환되는 3 개의 값, 즉 setter보다 먼저 호출 된 값 또는 setter에 전달 된 값 중 하나를 얻습니다 마찬가지로 B와 C의 값으로 오브젝트가 끝날 수도 있습니다. 말할 것도 없습니다.

멀티 스레드 프로그래밍의 주요 과제 중 하나 인 데이터 무결성을 보장하는 것은 다른 방법으로도 가능합니다.

여기에 추가 :

단일 속성의 atomicity 은 다중 종속 속성이 작동 할 때 스레드 안전성을 보장 할 수도 없습니다.

중히 여기다:

 @property(atomic, copy) NSString *firstName;
 @property(atomic, copy) NSString *lastName;
 @property(readonly, atomic, copy) NSString *fullName;

이 경우 스레드 A는 setFirstName: 을 호출하고 setLastName: 을 호출하여 개체의 이름을 바꿀 수 있습니다. 그 사이에 스레드 B는 스레드 A의 두 호출 사이에서 fullName 을 호출하고 이전 성과 결합 된 새로운 첫 번째 이름을 수신합니다.

이 문제를 해결하려면 트랜잭션 모델 이 필요합니다. 즉, 종속 속성이 업데이트되는 동안 fullName 대한 액세스를 제외 할 수있는 다른 종류의 동기화 및 / 또는 제외입니다.


원자는 스레드로부터 안전 합니다. 속도느리며 동일한 영역에서 몇 개의 스레드가 액세스하려고해도 잠긴 값만 제공된다는 것이 보장됩니다 (보장되지 않음) . 원자를 사용할 때,이 함수 내부에 작성된 코드는 임계 영역의 일부가되며, 한 번에 하나의 스레드 만 실행할 수 있습니다.

스레드 안전성 만 보장합니다. 그것은 보장하지 않습니다. 내 말은 당신이 당신을 위해 전문 운전 기사를 고용 했음에도 불구하고 자동차가 사고를 당하지 않을 것이라고 보장하지 않는다는 것입니다. 그러나 확률은 가장 적습니다.

원자 - 분해 할 수 없으므로 결과가 예상됩니다. 비 원자형 - 다른 스레드가 메모리 영역에 액세스 할 때이를 수정할 수 있으므로 예상치 못한 결과가 발생합니다.

코드 토크 :

원자 성 getter 및 속성 스레드의 setter를 안전하게 만듭니다. 예를 들면 :

self.myProperty = value;

스레드로부터 안전합니다.

[myArray addObject:@"Abc"] 

스레드로부터 안전하지 않습니다.


차이점을 이해하는 가장 좋은 방법은 다음 예제를 사용하는 것입니다.

"name"이라는 원자 문자열 속성이 있다고 가정하고, 스레드 A에서 [self setName:@"B"] 를 호출하면 스레드 B에서 [self setName:@"B"] 를 호출하고 [self name] 을 thread C의 경우, 다른 thread의 모든 조작은 직렬 적으로 실행됩니다. 이것은, 어느 thread가 setter 또는 getter를 실행하고있는 경우에, 다른 thread가 대기하는 것을 의미합니다.

이것은 속성 "name"을 읽기 / 쓰기 안전하게 만들지 만 다른 스레드 D가 [name release] 동시에 호출하면 여기에 관련된 setter / getter 호출이 없기 때문에이 작업은 충돌을 일으킬 수 있습니다. 즉, 객체는 읽기 / 쓰기 안전 (ATOMIC)을 의미하지만 다른 스레드가 모든 유형의 메시지를 동시에 객체에 보낼 수 있으므로 스레드로부터 안전하지 않습니다. 개발자는 이러한 객체에 대한 스레드 안전성을 보장해야합니다.

"name"속성이 비 원자형 인 경우 위의 예 (A, B, C 및 D)의 모든 스레드가 동시에 실행되어 예기치 않은 결과가 발생합니다. 원자의 경우 A, B 또는 C 중 하나가 먼저 실행되지만 D는 여전히 병렬로 실행할 수 있습니다.



원자 속성 : - 원자 속성이 할당 된 변수는 스레드 액세스가 하나 뿐이며 스레드 안전성이 뛰어나고 성능 관점에서 좋음을 의미하므로 기본 동작을가집니다.

비 원자 속성 - 원자 속성이 할당 된 변수가 다중 스레드 액세스를 의미하고 스레드 안전성이 낮고 성능 관점에서 느린 변수는 기본 동작을 가지며 두 개의 다른 스레드가 동시에 변수에 액세스하려고 할 때 그것은 예기치 않은 결과를 줄 것이다.


원자 = 스레드 안전성

비 원자력 = 스레드 안전 없음

스레드 안전성 :

인스턴스 변수는 런타임 환경에 의한 스레드 실행 스케줄링이나 인터리빙, 호출 코드 부분에 대한 추가 동기화 또는 기타 조정없이 다중 스레드에서 액세스 할 때 올바르게 동작하면 스레드 안전성을 갖습니다.

우리의 맥락에서 :

스레드가 인스턴스의 값을 변경하면 변경된 값을 모든 스레드가 사용할 수 있으며 한 번에 하나의 스레드 만 값을 변경할 수 있습니다.

atomic 를 사용할 곳 :

다중 스레드 환경에서 인스턴스 변수에 액세스 할 수 있는지 여부.

atomic 함축 :

nonatomic 은 런타임에서 워치 독 작업을 필요로하지 않기 때문에 nonatomic nonatomic 만큼 빠르지 않습니다.

nonatomic 을 사용하는 곳 :

인스턴스 변수가 여러 스레드에 의해 변경되지 않으면 사용할 수 있습니다. 성능이 향상됩니다.


원자재 : NSLOCK을 사용하여 스레드를 잠그면 스레드 안전을 보장합니다.

Non atomic : 스레드 잠금 메커니즘이 없기 때문에 스레드 안전성을 보장하지 않습니다.


전체 혼란을 단순화하기 위해 우리 mutex 잠금을 이해하자. 뮤텍스 잠금 이름에 따라 개체의 mutability를 잠급니다. 그래서 개체가 클래스에 의해 액세스 할 수없는 다른 클래스는 동일한 개체에 액세스 할 수 있습니다. iOS에서는 @sychronise 또한 뮤텍스를 제공합니다 lock.Now 그것은 FIFO 모드에서 제공하고 흐름이 같은 인스턴스를 공유하는 두 클래스에 의해 영향을받지 않습니다 보장합니다. 그러나 작업이 메인 스레드에서 UI를 보유하고 성능을 저하시킬 수 있으므로 원자 속성을 사용하여 개체에 액세스하지 마십시오


다중 스레드 코드에서 속성을 사용하는 경우 비 원자 및 원자 속성의 차이를 볼 수 있습니다. 비 원자가 원자보다 빠르며 원자가 비 원자가 아닌 스레드로부터 안전합니다.

Vijayendra Tripathi는 이미 멀티 스레드 환경에 대한 예를 제시했습니다.


시작하기 전에 : 새로운 쓰기가 발생하려면 메모리의 모든 객체를 메모리에서 할당 취소해야한다는 사실을 알아야합니다. 당신은 단순히 종이 위에하는 것처럼 무언가 위에 쓸 수 없습니다. 먼저 지우고 (dealloc) 지워야 합니다. 그러면 지울 수 있습니다. 그 순간에 지우기가 완료되었거나 (또는 ​​반쯤 완료된) 아무 것도 아직 쓰지 않았다면 (또는 절반을 쓴다면) 그것을 읽으려고하면 매우 문제가 될 수 있습니다! 원자 적 및 비 원자 학적 도움은이 문제를 다양한 방식으로 처리합니다.

먼저 읽고 this 질문을하고 읽을 Bbum의 답변을 . 또한 내 요약을 읽으십시오.

atomic 항상 보장 할 것이다.

  • 두 사람이 동시에 읽고 쓰고 싶다면 종이가 타지 않을 것입니다! -> 경쟁 상황에서도 응용 프로그램이 충돌하지 않습니다.
  • 한 사람이 글을 쓸 때 8 글자 중 4 글자 만 썼다면 가운데는 읽을 수 없으며 8 글자 만 쓰면 읽을 수 있습니다 -> 읽지 않음 (일어남)이 일어나지 않습니다 '쓰레드가 아직 쓰고있다'. 즉, 쓰여질 바이트가 8 바이트이고 4 바이트 만 쓰여진 경우 - 그 순간까지 읽을 수 없다. 그러나 나는 그것이 충돌하지 않을 것이라고 말한 이래 자동 완성 된 객체 의 가치를 읽을 것 입니다.
  • 경우 이전에 서면 당신은 이전에 종이에 작성 된 것을 삭제하고 누군가가 읽고 싶어 수 있습니다 여전히 읽어 보시기 바랍니다. 방법? 당신은 맥 OS 쓰레기통과 비슷한 것을 읽을 것입니다. (쓰레기통은 100 % 지워지지 않습니다 ... 그것은 림보에 있습니다.) ---> ThreadA가 이미 쓰여지는 동안 쓰레드를 읽는다면, 당신은 할 수 있습니다. ThreadB에 의해 완전히 작성된 최종 값에서 값을 얻거나 자동 풀 풀에서 무언가를 얻으십시오.

보유 수는 Objective-C에서 메모리를 관리하는 방법입니다. 객체를 만들면 보유 수는 1입니다. 객체를 보유 메시지로 보내면 보유 수는 1 씩 증가합니다. 객체를 릴리스 메시지로 보내면 보유 수는 1 씩 감소합니다. 객체에 autorelease 메시지를 보내면 , 미래의 어떤 단계에서 retain count가 1 씩 감소합니다. 객체의 보유 수를 0으로 줄이면 할당이 해제됩니다.

  • Atomic 스레드 안전성을 보장하는 것은 아니지만 스레드 안전성을 보장 하지는 않습니다 . 스레드 안전성은 코드를 작성하는 방법 / 읽고 쓰는 스레드 큐와 관련이 있습니다. 비 충돌 멀티 스레딩 만 보장합니다.

무엇을 기다립니다?! 멀티 스레딩과 스레드 안전이 다른가요?

예.멀티 스레딩이란 여러 스레드가 동시에 공유 데이터를 읽을 수 있으며 크래시는 발생하지 않지만 자동 복구되지 않은 값을 읽지 않는다고 보장하지는 않습니다. 스레드 안전성을 통해 읽은 내용이 자동으로 릴리스되지 않는다는 것을 보장합니다. 기본적으로 모든 것을 원자 적으로 만들지 않는 이유는 성능 비용이 있고 대부분의 경우 스레드 안전성을 필요로하지 않기 때문입니다. 코드의 일부분만으로도 잠금이 필요하며, 잠금, 뮤텍스 또는 동기화를 사용하여 스레드 안전 방식으로 코드를 작성해야하는 몇 가지 부분에 대해서만 사용할 수 있습니다.

nonatomic

  • Mac OS 쓰레기통과 같은 것이 없기 때문에 아무도 당신이 항상 가치를 (<- 이것은 잠재적으로 충돌로 이어질 수 있습니다) 신경 쓰지 않습니다. 메모리에 중도 쓰기는 종이에 중도 쓰기와 매우 다르지만 메모리에서는 이전에 미친 어리석은 가치를 얻을 수 있지만 종이에서는 절반 만 볼 수 있습니다.)> 충돌을 보장하지는 않습니다. autorelease 메커니즘을 사용하지 않습니다.
  • 완전한 서면 값을 읽을 수있는 것은 아닙니다.
  • 원자보다 빠릅니다.

전반적으로 그들은 2 가지면에서 다릅니다 :

  • 자동 복구 풀을 보유했는지 여부로 인해 충돌이 발생했는지 여부.

  • '아직 완료되지 않은 쓰기 또는 비어있는 값'의 중간에서 바로 읽을 수 있도록 허용하거나 허용하지 않고 값이 완전히 기록 된 경우에만 읽을 수 있도록 허용합니다 .


진실은 원자 속성을 구현하기 위해 스핀 잠금을 사용한다는 것입니다. 코드는 아래와 같습니다.

 static inline void reallySetProperty(id self, SEL _cmd, id newValue, 
      ptrdiff_t offset, bool atomic, bool copy, bool mutableCopy) 
    {
        id oldValue;
        id *slot = (id*) ((char*)self + offset);

        if (copy) {
            newValue = [newValue copyWithZone:NULL];
        } else if (mutableCopy) {
            newValue = [newValue mutableCopyWithZone:NULL];
        } else {
            if (*slot == newValue) return;
            newValue = objc_retain(newValue);
        }

        if (!atomic) {
            oldValue = *slot;
            *slot = newValue;
        } else {
            spin_lock_t *slotlock = &PropertyLocks[GOODHASH(slot)];
            _spin_lock(slotlock);
            oldValue = *slot;
            *slot = newValue;        
            _spin_unlock(slotlock);
        }

        objc_release(oldValue);
    }

  • -Atomic은 하나의 스레드 만 변수 (정적 유형)에 액세스한다는 것을 의미합니다.
  • - 원자는 스레드로부터 안전합니다.
  • - 성능이 느리다.

신고 방법 :

원자가 기본값이므로,

@property (retain) NSString *name;

및 구현 파일

self.name = @"sourov";

세 가지 속성과 관련된 작업이

 @property (retain) NSString *name;
 @property (retain) NSString *A;
 @property (retain) NSString *B;
 self.name = @"sourov";

모든 속성은 비동기처럼 병렬로 작동합니다.

쓰레드 A 에서 "name"을 호출하면 ,

동시에 전화하면

[self setName:@"Datta"]

스레드 B에서 ,

이제 * name 속성이 비 원자형 인 경우

  • A에 대해 "Datta"값을 반환합니다.
  • B에 대해 "Datta"값을 반환합니다.

그 이유는 비 원자력이 스레드를 안전하지 못하다고하지만 병렬 실행으로 인해 성능이 빠르다는 것입니다.

이제 * name 속성이 아톰 인 경우

  • 그것은 A에 대한 가치 "Sourov"을 보장합니다
  • 그런 다음 B에 대한 값 "Datta"를 반환합니다.

이 때문에 원자력 안전 스레드라고이다 즉, 호출 이유 안전 읽기 - 쓰기이다

이러한 상황 조작은 순차적으로 수행됩니다. 그리고 성능이 천천히

- 비 원자 값은 다중 스레드가 변수 (동적 유형)에 액세스 함을 의미합니다.

- 비 원자형은 스레드가 안전하지 않습니다.

-하지만 성능면에서는 빠릅니다.

-Nonatomic은 기본 동작이 아니므로 속성이 아닌 키워드를 추가해야합니다.

Swift의 경우 ObjC의 의미에서 Sweet 속성이 비 원자임을 확인합니다. 한 가지 이유는 속성마다 원 자성이 필요한지 여부를 생각하기 때문입니다.

참조 : https://forums.developer.apple.com/thread/25642

더 자세한 정보는 http://rdcworld-iphone.blogspot.in/2012/12/variable-property-attributes-or.html 웹 사이트를 방문하십시오.







nonatomic