답변:
MrMage가 링크 한 기사가 더 이상 작동하지 않습니다. 그래서 Objective-C에서 (매우) 단시간 코딩으로 배운 내용은 다음과 같습니다.
비 원자 대 원자- "원자"가 기본값입니다. 항상 "비 원자"를 사용하십시오. 나는 왜 그런지 모르겠지만 내가 읽은 책에는 "원자"를 사용하는 "드물게 이유"가 있다고 말했다. (BTW : 내가 읽은 책은 BNR "iOS Programming"책입니다.)
readwrite vs. readonly- "readwrite"가 기본값입니다. @synthesize하면 getter와 setter가 모두 생성됩니다. "읽기 전용"을 사용하면 setter가 생성되지 않습니다. 객체의 인스턴스화 후에 절대 변경하고 싶지 않은 값으로 사용하십시오.
유지 대 복사 대 할당
atomic
을 유지하도록 조언하는 것은 조언하는 것만 큼 좋지 않습니다 nonatomic
. 둘 중 어느 것도 "올바른"선택이 아니므로 언어 설계자들은 두 가지 솔루션 중 더 안전한 것을 선택했습니다. 실제로 nonatomic
매우 비싼 스레드 잠금을 생략하므로 일반적으로 더 나은 선택입니다. 사용하는 유일한 이유 atomic
는 속성이 여러 스레드에서 설정되어있는 경우 (이 경우 생략하면 초과 릴리스 또는 누수가 발생할 수 있음)입니다.
@property의 속성에 대해 알기 전에 @property의 사용법을 알아야합니다.
@property 는 클래스가 캡슐화 할 정보를 정의하는 방법을 제공합니다. @property를 사용하여 객체 / 변수를 선언 하면 해당 객체 / 변수는 해당 클래스를 가져 오는 다른 클래스에서 액세스 할 수 있습니다.
헤더 파일에서 @property 를 사용하여 객체를 선언 하면 구현 파일에서 @synthesize 를 사용하여 객체 를 합성해야 합니다. 이것은 객체 KVC를 준수 합니다. 기본적으로 컴파일러는 이 객체에 대한 접근 자 메서드 를 합성 합니다.
접근 자 메소드는 setter 및 getter입니다.
예 : .h
@interface XYZClass : NSObject
@property (nonatomic, retain) NSString *name;
@end
.미디엄
@implementation XYZClass
@synthesize name;
@end
이제 컴파일러는 name에 대한 접근 자 메서드를 합성 합니다.
XYZClass *obj=[[XYZClass alloc]init];
NSString *name1=[obj name]; // get 'name'
[obj setName:@"liza"]; // first letter of 'name' becomes capital in setter method
@property 의 속성 목록
원자, 비 원자, 유지, 복사, 읽기 전용, 읽기 / 쓰기, 할당, 강함, getter = method, setter = method, unsafe_unretained
원자가 기본 동작입니다. 객체가 원자로 선언되면 스레드로부터 안전 해집니다. 스레드 안전은 한 번에 해당 클래스의 특정 인스턴스에서 하나의 스레드 만 해당 개체를 제어 할 수 있음을 의미합니다.
스레드가 getter 메소드를 수행중인 경우 다른 스레드가 해당 오브젝트에서 setter 메소드를 수행 할 수 없습니다. 느립니다.
@property NSString *name; //by default atomic`
@property (atomic)NSString *name; // explicitly declared atomic`
이러한 이유로 원자 이외의 특성에 액세스하는 것이 더 빠릅니다.
@property (nonatomic)NSString *name;
setter 메소드는 오브젝트의 보유 횟수를 증가시켜 자동 릴리스 풀에서 메모리를 차지합니다.
@property (retain)NSString *name;
변경 가능한 문자열이 설정되고 이후에 변경 되더라도 인스턴스는 설정 당시의 값을 캡처합니다. setter 및 getter 메소드는 합성되지 않습니다.
@property (copy) NSString *name;
지금,
NSMutableString *nameString = [NSMutableString stringWithString:@"Liza"];
xyzObj.name = nameString;
[nameString appendString:@"Pizza"];
이름 은 영향을받지 않습니다.
컴파일러는 getter를 생성하지만 setter는 생성하지 않습니다.
@property (readonly) NSString *name;
읽기 전용과 반대입니다.
@property (readwrite) NSString *name;
가비지 수집이 활성화 된 경우 유지 및 할당은 기본적으로 호환됩니다.
@property (assign) NSInteger year;
ARC와 함께 제공됩니다.
@property (nonatomic, strong) AVPlayer *player;
부울 속성 (YES 또는 NO 값이있는 속성)의 경우 getter 메서드가 "is"라는 단어로 시작하는 것이 일반적입니다.
@property (getter=isFinished) BOOL finished;
메소드는 콜론으로 끝나야합니다.
@property(setter = boolBool:) BOOL finished;
안전하지 않은 참조는 관련 개체를 유지하지 않는다는 점에서 약한 참조와 비슷하지만 대상 개체의 할당이 해제되면 nil 로 설정되지 않습니다 .
@property (unsafe_unretained) NSObject *unsafeProperty;
여러 속성을 지정해야하는 경우 다음과 같이 속성을 쉼표로 구분 된 목록으로 포함하십시오.
@property (readonly, getter=isFinished) BOOL finished;
@property
헤더 파일을 사용하여 오브젝트를 선언 하면 구현 파일을 사용하여 오브젝트 를 합성해야 @synthesize
합니다." 항상 그런 것은 아닙니다. 예를 들어 "기본적으로 readwrite
속성은 인스턴스 변수에 의해 지원되며 컴파일러에서 자동으로 다시 합성합니다." 에서 문서 .
많은 기사를 읽은 후 모든 속성 정보를 하나로 묶기로 결정했습니다.
- 원자 // 기본
- 비 원자
- strong = 보유 // 기본
- 약한 = unsafe_unretained
- 유지
- // 디폴트 할당
- unsafe_unretained
- 부
- 읽기 전용
- readwrite // 기본
다음은 이러한 속성을 찾을 수있는 자세한 기사에 대한 링크입니다.
최고의 답변을 주신 모든 분들께 감사드립니다 !!
다음은 기사의 샘플 설명입니다.
예 :
@property (retain) NSString *name;
@synthesize name;
예:
@property (nonatomic, retain) NSString *name;
@synthesize name;
설명:
"name"이라는 원자 문자열 특성이 있고 스레드 A에서 [self setName : @ "A"]를 호출하는 경우 스레드 B에서 [self setName : @ "B"]를 호출하고 다음에서 [self name]을 호출하십시오. 스레드 C의 경우 다른 스레드의 모든 작업이 순차적으로 수행되므로 한 스레드가 setter 또는 getter를 실행하면 다른 스레드가 대기합니다. 이로 인해 "name"속성이 읽기 / 쓰기에 안전하지만 다른 스레드 D가 [name release]을 (를) 동시에 호출하면 여기에 관련된 setter / getter 호출이 없기 때문에이 작업으로 인해 충돌이 발생할 수 있습니다. 이는 다른 스레드가 동시에 모든 유형의 메시지를 개체에 보낼 수 있으므로 개체가 읽기 / 쓰기 안전 (ATOMIC)이지만 스레드 안전하지 않음을 의미합니다. 개발자는 그러한 물체에 대해 스레드 안전을 보장해야합니다.
"name"속성이 원자가 아닌 경우 위의 예-A, B, C 및 D에있는 모든 스레드가 동시에 실행되어 예기치 않은 결과가 생성됩니다. 원자의 경우 A, B 또는 C 중 하나가 먼저 실행되지만 D는 여전히 병렬로 실행될 수 있습니다.
예:
@property (strong, nonatomic) ViewController *viewController;
@synthesize viewController;
예 :
@property (weak, nonatomic) IBOutlet UIButton *myButton;
@synthesize myButton;
BJ 호머 덕분에 강력하고 약한 설명 :
우리의 물건이 개이고, 개가 도망 치고 싶다고 상상해보십시오. 강한 포인터는 강아지의 가죽 끈과 같습니다. 가죽 끈이 개에 붙어있는 한 개는 도망 가지 않습니다. 5 명이 가죽 끈을 1 마리의 개 (한 물체에 5 개의 강한 포인터)에 부착하면 5 개의 가죽 끈이 모두 분리 될 때까지 개가 도망 가지 않습니다. 반면에, 약한 포인터는 어린 아이들이 개를 가리키며 "보라! 개"라고 말하는 것과 같습니다. 개가 여전히 가죽 끈에있는 한, 작은 아이들은 여전히 개를 볼 수 있으며, 여전히 개를 가리킬 것입니다. 그러나 모든 가죽 끈이 분리 되 자마자, 작은 아이가 몇 개를 가리켜도 개는 도망칩니다. 마지막 강한 포인터 (끈)가 더 이상 객체를 가리 키지 않으면 객체가 할당 해제되고 모든 약한 포인터는 0이됩니다. 우리가 약한 것을 사용할 때? 당신이 약한 것을 사용하고 싶은 유일한 시간은 당신이 유지주기를 피하고 싶을 때입니다.
예:
@property (nonatomic, retain) NSString *name;
@synthesize name;
예:
@property (nonatomic, assign) NSString *address;
@synthesize address;
unsafe_unretained
-unsafe_unretained는 보유 / 릴리스 호출을 삽입하는 방법을 ARC에 알려주는 소유권 한정자입니다. -unsafe_unretained는 assign의 ARC 버전입니다.
예:
@property (nonatomic, unsafe_unretained) NSString *nickName;
@synthesize nickName;
예:
@property (nonatomic, copy) NSArray *myArray;
@synthesize myArray;
한 번에 하나의 스레드 만 원자 속성에 액세스 할 수 있습니다. 그것은는 스레드 안전합니다 . 기본값은 atomic입니다. 키워드 atomic 이 없습니다.
비원 자란 다중 스레드가 항목에 액세스 할 수 있음을 의미합니다. 스레드 안전하지 않은
따라서 atomic을 사용하는 동안 매우 조심해야합니다.
iOS의 objective-c 속성에 대한이 링크를 선호합니다.
https://techguy1996.blogspot.com/2020/02/properties-in-objective-c-ios.html