IOS 속성 수정자 assign weak copy
assign
기본 데이터 형식 int float double bool에 대한 약한 인용
weak
약한 참조는 NSObject 객체에 적용되며 weak 코스메틱 객체가 놓인 후에는 포인터 주소가 nil로 설정됩니다.runtime는 등록된 클래스를 레이아웃하고 weak 대상에 대한hash표에 넣습니다.weak가 가리키는 대상의 메모리 주소를 키로 하고, 이 대상의 인용 계수기가 0일 때 dealloc를 사용합니다. weak가 가리키는 대상의 메모리 주소가 a이면 a를 키로 하고, 이 weak표에서 검색하여 a를 키로 하는 모든 weak 대상을 찾고nil로 설정합니다.
copy
NSString NSArray NSDictionary 는 왜 copy 를 자주 사용합니까?코피를 사용하는 목적은 대상의 속성이 외부의 영향을 받지 않도록 하기 위해서이다.만약에 NSMutable Array가 들어왔다면 copy를 사용하면 NSArray가 되어 외부에서 바꿀 수 없습니다.
NSError 는 copy 를 사용합니다. 왜냐하면 copying 프로토콜이 이루어졌기 때문입니다.
이렇게 쓰면 무슨 문제가 있습니까: @property(copy) NSMutable Array *array;
NSString *str = @"123";
NSString *strCopy = [str copy]; //
NSLog(@"str = %@ strCopy = %@",str,strCopy);
NSLog(@"str :%p strCopy :%p",str,strCopy);
str = @"a"; // ( )
NSLog(@"str = %@ strCopy = %@",str,strCopy);
NSLog(@"str :%p strCopy :%p",str,strCopy);
NSMutableString *mustr = [str copy]; // mustr
NSMutableString *muCopy = [str mutableCopy];
NSLog(@"mustr = %@ muCopy = %@",mustr,muCopy);
NSLog(@"mustr :%p muCopy :%p",mustr,muCopy);
[muCopy appendString:@"b"];
NSLog(@"mustr = %@ muCopy = %@",mustr,muCopy);
NSLog(@"mustr :%p muCopy :%p",mustr,muCopy);
str = 123 strCopy = 123
str :0x106ecdc58 strCopy :0x106ecdc58
str = a strCopy = 123
str :0x106ecdcb8 strCopy :0x106ecdc58
mustr = a muCopy = a
mustr :0x106ecdcb8 muCopy :0x60000007cc80
mustr = a muCopy = ab
mustr :0x106ecdcb8 muCopy :0x60000007cc80
변환할 수 없는 용기 대상에 대한 코피 호출 방법은 원래 대상에 대한 지침에 대한 인용을 증가시켰을 뿐입니다. mutableCopy 호출 방법은 메모리를 다시 분배한 다음 새 대상에 대한 지침을 새 메모리로 가리키는 것입니다.가변 대상에 대해서는 코피를 호출하든지mutable Copy를 호출하든지 메모리를 새로 분배합니다.그러나 메모리를 다시 분배했지만 대상 안의 데이터는 여전히 바늘값이다.
NSArray *array = [NSArray arrayWithObjects:[NSMutableString stringWithString:@"1"],@"2",@"3", nil];
NSArray *arrayCopy = [array copy];
NSArray *arrayMutableCopy = [array mutableCopy];
NSLog(@"array :%p arrayCopy :%p arrayMutableCopy :%p",array,arrayCopy,arrayMutableCopy);
NSLog(@"array = %@ arrayCopy = %@ arrayMutableCopy = %@",array,arrayCopy,arrayMutableCopy);
NSMutableArray *mutableArrayCopy = [array copy];
NSMutableArray *mutableArrayMutableCopy = [array mutableCopy];
NSLog(@"array :%p mutableArrayCopy :%p mutableArrayMutableCopy :%p",array,mutableArrayCopy,mutableArrayMutableCopy);
NSLog(@"array = %@ mutableArrayCopy = %@ mutableArrayCopy = %@",array,mutableArrayCopy,mutableArrayMutableCopy);
NSMutableString *mustr = array[0];
[mustr appendString:@"2"];
NSLog(@"array %p arrayCopy %p arrayMutableCopy %p mutableArrayCopy %p mutableArrayCopy %p",array,arrayCopy,arrayMutableCopy,mutableArrayCopy,mutableArrayMutableCopy);
NSLog(@"array = %@ arrayCopy = %@ arrayMutableCopy = %@ mutableArrayCopy = %@ mutableArrayCopy = %@",array,arrayCopy,arrayMutableCopy,mutableArrayCopy,mutableArrayMutableCopy);
array :0x6080000538f0 arrayCopy :0x6080000538f0 arrayMutableCopy :0x608000050d70
array = (
1,
2,
3
)
arrayCopy = (
1,
2,
3
)
arrayMutableCopy = (
1,
2,
3
)
array :0x6080000538f0 mutableArrayCopy :0x6080000538f0 mutableArrayMutableCopy :0x608000050890
array = (
1,
2,
3
)
mutableArrayCopy = (
1,
2,
3
)
mutableArrayCopy = (
1,
2,
3
)
array 0x6080000538f0 arrayCopy 0x6080000538f0 arrayMutableCopy 0x608000050d70 mutableArrayCopy 0x6080000538f0 mutableArrayCopy 0x608000050890
array = (
12,
2,
3
)
arrayCopy = (
12,
2,
3
)
arrayMutableCopy = (
12,
2,
3
)
mutableArrayCopy = (
12,
2,
3
)
mutableArrayCopy = (
12,
2,
3
)
원래 그룹의 값을 변경한 후에 모든 새 그룹의 값이 변경되었음을 알 수 있습니다. Mutable Copy 방법을 사용해서 만든 새 그룹의 값도 변경되었기 때문에 시스템 용기 클래스의 대상에 대해 요소 대상은 항상 바늘로 복사되었음을 알 수 있습니다.
사용자 정의 클래스에 NSCopying 프로토콜이 기본적으로 적용되지 않음
Person *p1 = [[Person alloc] init];
Person *p2 = [p1 copy]; //
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[Person copyWithZone:]: unrecognized selector sent to instance 0x608000011570'
property
@property = ivar(인스턴스 변수) + Getter + setter
@implementation Book
@dynamic name;
@synthesize age = _age;
@synthesize 컴파일러가 자동으로 Getter/setter 방법을 생성합니다. 사용자 정의 접근 방법이 있을 때 자동으로 생성되지 않습니다.
@dynamic 컴파일러가 자동으로 Getter/setter를 생성하지 않는 방법을 알려줍니다
protocol에서 @property를 사용하면 setter getter 방법만 생성할 수 있습니다. 프로토콜을 준수하는 대상이 이 속성 방법을 실현하기를 희망합니다. setter와 getter를 동시에 다시 썼을 때 시스템에서ivar을 생성하지 않습니다.해결 방법은 다음과 같은 두 가지가 있다
@interface ViewController () {
// NSString *_name; 1: ivar
}
@property (nonatomic, strong) NSString *name;
@end
@implementation ViewController
//@synthesize name = _name; 2: @sysnthesize @property ivar
- (void)viewDidLoad {
[super viewDidLoad];
}
- (NSString *)name{
//return _name;
}
- (void)setName:(NSString *)name{
//_name = @"";
}
@end
set get
- (void)setName:(NSString *)name{
if (_name != name) {
[name retain];
[_name release];
_name = name;
}
}
self.name = @"dog"; // setter
NSLog(@"%@",self.name); // getter
_name = @"cat"; //
NSLog(@"%@",_name); //
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.