중화사전망 - 서예자전 - Ios 수정자 기능
Ios 수정자 기능
안에 ...
호: 할당, 비고정, 강함, 복사
MRC: 할당, 보존, 복제, 비원자, 원자
할당 (ARC/MRC)
1. 이 수정자는 정수/부동 소수점 데이터 유형에 사용되는 직접 할당을 의미합니다.
2. 비고정 보존 복제를 사용하지 않을 경우 기본적으로 할당이 사용됩니다. (둘 사이에는 관계가 있다)
3. 물론 개체도 assign 으로 수정할 수 있지만 개체의 카운터는+1 이 아닙니다. (강과의 차이).
4. 오브젝트의 속성을 수정하는 데 사용하면 오브젝트가 제거된 후 포인터가 nil 을 가리키지 않으므로 필드 포인터 오류 (weak 와 다름) 가 발생합니다.
비고정 (호) (객체)
1. 약한 포인터는 개체의 수정자입니다. 즉, int float 을 수정할 수 없습니다.
2.2.weak 수식의 참조 카운터는+1 이 아닙니다. 즉, 직접 값을 지정합니다.
약한 인용은 순환 인용을 깨기 위해 태어났습니다. 예를 들어 한 블록에서 복사할 때 내부적으로 사용되는 객체에 대한 참조 기술은+1 입니다. [self method name] 을 사용하는 경우+1 의 참조 개수로 self 가 있는 클래스의 메모리 주소에 대한 강한 포인터가 있어 클래스가 있는 메모리 주소를 해제할 수 없어 메모리 누수가 발생합니다.
4. 가장 인기 있는 이유는 가리키는 오브젝트가 파괴되면 nil 을 가리키므로 필드 포인터 오류가 발생하지 않기 때문입니다.
약함과 할당의 차이
할당과 약함, 모두 약한 참조 선언 유형이지만 서로 다릅니다.
1. weak 로 선언된 변수는 스택에서 자동으로 비워지고 nil 에 할당됩니다.
2. assign 으로 선언된 변수는 스택에서 nil 에 자동으로 지정되지 않을 수 있으며, 이로 인해 와일드카드 포인터 오류가 발생할 수 있습니다!
위임 성명을 예로 들다. MRC 에서 많은 위임 선언은 순환 참조를 피하기 위해 할당을 사용합니다. 이때 delegate 의 필드 포인터 오류를 방지하기 위해 -dealloc 메서드에 self.delegate = nil 을 써야 합니다. 물론 ARC 에서는 weak 로 delegate 를 선언하면 자동으로 릴리즈됩니다.
강한 (호) (물체)
1. 객체에 대한 직접 할당 및 참조 카운터+1.
2. ARC 에서 예약된 역할을 대체합니다.
예약됨 (MRC)
1. 이전 객체 (이전 객체 카운터-1) 를 해제하고 새 객체 (새 객체 카운터+1) 를 유지한 다음 새 객체를 가리킵니다.
Set 메서드에서는 다음과 같습니다.
만약 (_ 개! = 0)
{
[_ 개 출시];
}
_ dog = [dogretain];
복사 (ARC/MRC)
1.copy MRC 에서 이렇게 합니다. 이전 객체를 해제 (이전 객체의 참조 카운터는-1) 하고 새 객체를 복사 (새 객체의 참조 카운터는+1) 한 다음 새 객체를 가리킵니다. (새 오브젝트는 최종적으로 가리키는 오브젝트입니다. 깊은 복사본이든 얕은 복사본이든 상관 없습니다.).
설정 방법의1..1은 다음과 같습니다.
만약 (_ 개! = 0)
{
[_ 개 출시];
}
_ dog =[ 개 복사];
2. 복사 ARC 에서 이 작업을 수행합니다. 새 객체 (새 객체에 대한 참조 카운터+1) 를 복사한 다음 새 객체를 가리킵니다.
설정 방법의 2. 1 은 다음과 같습니다.
_ dog =[ 개 복사];
3. 사용 지침:
3. 1 수정된 속성은 변경되지 않습니다. 예를 들어 NSMutableArray 는 copy 로 손질되며 object 를 추가하면 충돌이 발생합니다. NSMutableArray 의 객체는 copy 후 NSArray 가 되기 때문입니다. NSMutableArray 오브젝트의 복사본이 필요한 경우 mutablecopy 를 사용합니다.
3.2 NSCopying 프로토콜을 준수하는 객체 사용.
비원자
1.set 메서드에 동기화 잠금이 추가되지 않았습니다.
2. 우수한 성능
이 스레드는 안전하지 않습니다
원자 (아크 /MRC)
1. 원자 속성은 상호 배타적인 잠금 @synchronized (잠금 개체) 를 생성된 set 메서드에 추가하는 것입니다.
@ synchronized (self) {_ delegate = delegate; }
시스템 자원을 소비해야합니다.
3. 뮤텍스는 스레드 동기화를 통해 수행되며, 한 번에 하나의 스레드만 set 메서드를 호출하도록 하기 위한 것입니다.
실제로 get 방법도 있습니다. Set 와 get 을 동시에 호출하면 문제가 생길 수 있습니다. 그래서 원자 장식을 사용해도 안전하지 않다.
비 원자와 원자의 소개와 차이점
1 .. 원자성이란 무엇입니까?
원자성: 나는 원자성을 스레드의 속성에 대한 단일 실행으로 이해한다.
예를 들어, 두 스레드가 동시에 한 속성의 설정 메소드를 실행합니다. 원자가 아닌 경우 (즉, 속성을 선언할 때 nonatimic 을 사용하는 경우) 스레드 A 가 속성 값을 다시 작성할 때 스레드 B 가 갑자기 침입하여 수정되지 않은 속성 값을 읽을 수 있습니다. 이 경우 스레드에서 읽은 속성 값이 틀릴 수 있습니다.
원자성이 정말로 스레드 안전인지 확인하십시오. 왜 일상 문장에서 비원자를 사용해야 합니까?
1. 원자성이 스레드 안전이 아닌지 확인합니다. 안전을 보장해야 한다면 깊은 스레드 잠금 메커니즘을 따라야 한다.
2. iOS 에서 동기화 잠금을 사용하면 비용이 많이 들고 프로그램에 성능 문제가 발생할 수 있습니다.
원자성이 스레드 안전을 보장하지 않는 이유는 무엇입니까?
예를 들어 atomic 을 사용해도 스레드 오류가 계속 발생할 수 있습니다. 스레드 a 가 set 작업을 수행할 때 다른 스레드의 get 또는 set 작업이 작업을 기다립니다. 스레드 A 의 설정 작업이 끝나면 스레드 B 는 설정 작업을 수행한 다음 스레드 A 에 get 작업이 필요할 때 스레드 B 의 값을 가져와서 스레드 보안을 손상시킵니다. 스레드 C 가 스레드 A 의 get 작업 전에 이 속성을 풀면 프로그램 충돌이 발생할 수도 있습니다. 따라서 atomic 만 사용해도 스레드가 안전하지는 않습니다. 스레드 안전을 보장하기 위해 스레드를 잠가야 합니다.
읽기 전용 (읽기 전용)
1. Xcode 에서 get 메서드만 생성하도록 합니다.
2. 노출된 속성을 함부로 교체하지 않으려는 경우 사용할 수 있습니다.
읽기 및 쓰기 (기본값)
1. Xcode 에서 get/set 메서드를 생성하도록 합니다.
2. readonly 를 사용하지 않을 경우 기본적으로 readwrite 입니다.