iOS에서 @property()valueTypevalue 괄호 안의 속성 설정

4487 단어

//readonly


읽기만 하면 값을 부여받을 수 없습니다. getter만 생성하면 setter 방법이 없습니다. get 방법만 사용할 수 있습니다.

//readwrite


읽을 수 있고 쓸 수 있는readonly가 없으면 기본값readwrite입니다.값을 부여할 수도 있고, 값을 부여할 수도 있다. 즉,readwrite 속성을 추가하면 변수에 get과 set 방법이 있다.

//retain MRC


속성은objc 대상이어야 하며, 대상 소유권 인용 계수 증가 1.setter 방법은 매개 변수에 대해release 구값을 하고retain 새 값을 만듭니다. 모든 실현은 이 순서입니다.옛 대상을 방출할 때 옛 대상의 값을 입력 대상에게 부여하고 입력 대상의 인덱스 기술을 1로 향상시킨다. (retain은 지침copy로 같은 주소를 가리키며 계수는 1을 더하고copy는 내용을 복사한다)

//copy


속성은 반드시 objc 대상이고 대상의 소유권을 가지고 색인 계수가 1인 대상을 만든 다음에 옛 대상을 풀어야 한다.setter 방법은copy작업을 진행합니다.retain 처리 프로세스와 같이 이전 값인release를 사용하여copy에서 새로운 대상을 만듭니다.retainCount는 1입니다.이것은 상하문에 대한 의존을 줄이기 위해 도입된 메커니즘이다.copy는 사실 같은 속성을 만들었지만retain은 그렇지 않습니다.

//assign


대상에 대한 소유권이 없을 때 보통 delegate입니다.직접 값을 부여합니다.retain 조작이 필요 없습니다. 원형 클래스와 순환 인용 문제를 해결하기 위해 간단하게 값을 부여하고 색인 계수를 변경하지 않습니다.기본 데이터 형식(예를 들어 NSInteger, CGFloat)과 C 데이터 형식(int,float,double,char 등)에 간단한 데이터 형식을 적용합니다. 이 표시는 설정기가 직접 값을 부여하는 것을 설명합니다. 이것도 기본값입니다.쓰레기 수집을 사용하는 프로그램에서 assign을 사용하고 NSCopying 프로토콜에 부합되는 속성을 원한다면 이 표시를 명확하게 지적해야 한다. 기본값을 간단하게 사용하지 않으면 컴파일러 경고를 받고 컴파일러에게 값을 부여해야 하며, 제때에 복사할 수 있다는 것을 다시 한 번 설명해야 한다.

//weak


약한 인용은 대상을 보유할 수 없습니다. 방출 후 공백으로 설정합니다
// 
@property (nonatomic, strong) NSMutableString *string1;
@property (nonatomic, weak) NSMutableString *string2;
// 
@synthesize string1;
@synthesize string2;
// :String 2 = null
self.string1 = [[NSMutableString alloc] initWithString:@"string 1"];
self.string2 = self.string1;
self.string1 = nil;
NSLog(@"String 2 = %@",self.string2);

왜냐하면string1과self.string2는 같은 주소를 가리키고 string2는retain 메모리 주소가 없으며self.string1 = nil이 메모리를 방출했기 때문에string1은nil입니다.weak로 성명된 바늘입니다. 바늘이 가리키는 주소가 풀리면, 이 바늘들은 모두 nil로 지정됩니다.이런 장점은 야외 지침을 효과적으로 방지할 수 있다.

//strong


강제 인용, 소지 대상, 대상이 목록에 나타나지 않을 때 방출
//strong retain , , +1, 
@property (nonatomic, strong) NSMutableString *string1;
@property (nonatomic, weak) NSMutableString *string2;
// 
@synthesize string1;
@synthesize string2;
// :String 2 = String 1;
self.string1 = [[NSMutableString alloc] initWithString:@"String 1"];
self.string2 = self.string1;
self.string1 = nil;
NSLog(@"String 2 = %@",self.string2);

string2는strong이 정의한 속성이기 때문에 계수 + 1을 인용하여 가리키는 값이 @ "String 1"입니다.

//nonatomic


비원자적 접근, 속성에 값을 부여할 때 잠그지 않음, 다중 스레드 병렬 접근은 성능을 향상시킬 수 있습니다.이 속성을 추가하지 않으면 기본적으로 두 접근 방법이 원자형 사무에 접근합니다.자물쇠가 소속 대상의 실례 레벨에 추가되었습니다.그래서 nonatomic를 넣지 않는 것은 다선정에 안전하다.nonatomic는 다중 스레드, 변수 보호, 성능 향상을 금지합니다.

//atomic


다중 스레드 보안 원자성 접근을 제공합니다.atomic와nonatomic의 차이는 컴파일러가 생성한 Getter와setter가 원자로 작동하는지 여부를 결정하는 데 사용됩니다.atomic는 다중 루틴 보안을 제공합니다. 이 변수가 다중 루틴의 동기화 접근을 지원하는지 설명합니다.아토믹을 선택하면 lock 자물쇠를 자동으로 만들고 변수를 잠그는 것입니다.기본적으로 이 속성이 있습니다.atomic의 뜻은 setter/getter라는 함수로 조작에서 기원된 것이다.만약에 여러 개의 스레드가 동시에 setter를 호출한다면 어떤 스레드가 setter의 모든 문장을 실행하기 전에 다른 스레드가 setter를 실행하기 시작하는 상황이 나타나지 않을 것이다. 이것은 함수 머리와 끝에 자물쇠를 넣은 것과 같이 데이터의 완전성을 보장할 수 있다.
{lock}
if (property != newValue){
    [property release];
    property = [newValue retain];
}
{unlock}

이를 통해 알 수 있듯이 tomic를 사용하면 여러 라인의 설정에서 값을 얻을 때 자물쇠를 채운다. 중간의 집행층은 보호된 상태에 있다. tomic는 OC가 사용하는 라인 보호 기술이다. 기본적으로 말하자면 쓰기가 완성되지 않았을 때 다른 라인에 의해 읽혀져 데이터 오류를 초래하는 것을 방지하는 것이다. 그러나 이런 메커니즘은 시스템 자원을 소모하는 것이다.

//unsafe_unretained


안전하지 않은 수식자, weak 소지하지 않은 대상과ios4 이전에 사용
// , 
@property (nonatomic, strong) NSString *string1;
@property (nonatomic, unsafe_unretained) NSString *string2;
// , crash 
self.string1 = [NSString stringWithUTF8String:"string 1"];
self.string2 = self.string1;
self.string1 = nil;
NSLog(@"String 2 = %@", self.string2);

여기는 출력이 없을 뿐만 아니라, 프로그램에서crash가 나올 수도 있습니다.그 원인은 바로 야생 지침이 존재하기 때문에 야생 지침이라는 것은 상당히 무섭다.왜 야생 지침을 만들었는지, unsafe를 사용하는 것에 대해self.string1 = nil은 메모리를 방출했지만 string2는 방출된 줄 모르기 때문에 야외 지침이 나타납니다.그리고 야생 지침의 메모리에 접근하면crash.그래서 최대한 unsafe를 적게 쓰도록 하겠습니다.unretained.


//setter


set 방법을 지정하고 이 방법을 실현해야 합니다.성명 형식과 같은 매개 변수를 가지고 있습니다. 되돌아오는 값이 없습니다. (빈 값을 되돌려줍니다.)

//getter


get 방법을 지정하고 이 방법을 실현해야 합니다.성명 형식과 같은 변수를 되돌려야 합니다. 인자가 없습니다.

//nonnull


공백일 수 없습니다.

//nullable


공백일 수 있음

좋은 웹페이지 즐겨찾기