NSString은 왜 copy를 사용합니까?블락이 왜 코피를 써?
copy
깊이 있는 복사와 얕은 복사의 차이는 새로운 메모리를 개척하는지 여부에 있다. 코피는 메모리를 쌓는 대상에게만 적용된다.
간단한 복사:
복제된 주소는 대상의 = 할당값과 같다.OC에서 NSString 속성을 선언합니다.@property NSString *str;
왜 이*
가 있는지, c언어에서*
는 값을 얻는 조작부호이고, *str
는 값에 대응하기 때문에 str
는 * str
의 주소인데, 왜 이를=전달하는 것은 대상의 주소이고, 얕은 복사는 주소의 복사이다.
& 주소 찾기 조작부호, 일반적인 값 변수는 창고 메모리에 존재합니다.int a = 5;
a에 대응하는 창고에 저장된 5, & a에 대응하는 창고 메모리 주소.
딥 카피:
새로운 메모리 공간을 개척하는 것은 새로운 대상을 설명하는 것과 같고 대상의 값은 현재 대상의 값과 같다.
NSString은 왜 copy를 사용합니까?
@property (nonatomic, strong) NSString *strongStr;
@property (nonatomic, copy) NSString *cpyStr;
우리는 두 개의 대상이 있는데, 하나는 스트롱을 사용하고, 하나는 코피를 사용한다.NSString *tmpStr = @"temp";
self.strongStr = tmpStr;
self.cpyStr = tmpStr;
2017-04-10 12:06:11.953 Copy[66625:4617737] tmpStr:temp
strongStr:temp
cpyStr:temp
2017-04-10 12:06:11.953 Copy[66625:4617737] tmpStr:0x10f096078
strongStr:0x10f096078
cpyStr:0x10f096078
변하지 않는 문자열에 대해 코피와 스트롱은 모두 얕은 복사입니다.NSMutableString *tmpStr = [[NSMutableString alloc] initWithString:@"temp"];
self.strongStr = tmpStr;
self.cpyStr = tmpStr;
[tmpStr appendString:@" + add"];
NSLog(@"tmpStr:%@
strongStr:%@
cpyStr:%@", tmpStr, self.strongStr, self.cpyStr);
NSLog(@"tmpStr:%p
strongStr:%p
cpyStr:%p", tmpStr, self.strongStr, self.cpyStr);
2017-04-10 11:58:56.888 Copy[66562:4610424]
tmpStr:temp + add
strongStr:temp + add
cpyStr:temp
2017-04-10 11:58:56.888 Copy[66562:4610424] tmpStr:0x600000271580
strongStr:0x600000271580
cpyStr:0xa000000706d65744
tmpStr가 바뀐 후에 strongStr도 바뀌었습니다. strongStr는 변할 수 없는 문자열이지만, 변할 수 있는 문자열을 가리킵니다.cpyStr는 깊은 복사본으로 메모리와 tmpStr가 완전히 다르다는 것을 볼 수 있습니다.
NSMutable String에서는 copy를 사용할 수 없습니다.@property (nonatomic, copy) NSMutableString *mutableString;
copy가 되돌아오는 것은 변할 수 없기 때문에 실행appendString:
등 NSMutable String 특유의 방법을 실행할 때unrecognized selector sent to instance
이 오류를 보고합니다.
tips:
NSString은 상수를 직접 가리킬 수 있지만 NSMutableString은 사용할 수 없는 이유는 무엇입니까?변하지 않는 문자열, 변하지 않는 문자열, 그는 상수를 가리킬 수 있다. 상수는 변하지 않고 상수 구역에 저장된다.
블락이 왜 코피를 써?
코드 블록은 창고에 존재하기 때문에 코피를 통해 메모리로 복사해야 한다. ARC에서 값을 부여할 때 컴파일러는 스스로 Block에 대해 코피 작업을 하고 코피를 메모리로 복사한다. 일반적인 대상과 같다.그래서 ARC에서 Block을 사용하면copy와strong을 사용하는 것과 다를 것이 없습니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSON
JSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다.
그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다.
저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.
@property NSString *str;
int a = 5;
@property (nonatomic, strong) NSString *strongStr;
@property (nonatomic, copy) NSString *cpyStr;
NSString *tmpStr = @"temp";
self.strongStr = tmpStr;
self.cpyStr = tmpStr;
2017-04-10 12:06:11.953 Copy[66625:4617737] tmpStr:temp
strongStr:temp
cpyStr:temp
2017-04-10 12:06:11.953 Copy[66625:4617737] tmpStr:0x10f096078
strongStr:0x10f096078
cpyStr:0x10f096078
NSMutableString *tmpStr = [[NSMutableString alloc] initWithString:@"temp"];
self.strongStr = tmpStr;
self.cpyStr = tmpStr;
[tmpStr appendString:@" + add"];
NSLog(@"tmpStr:%@
strongStr:%@
cpyStr:%@", tmpStr, self.strongStr, self.cpyStr);
NSLog(@"tmpStr:%p
strongStr:%p
cpyStr:%p", tmpStr, self.strongStr, self.cpyStr);
2017-04-10 11:58:56.888 Copy[66562:4610424]
tmpStr:temp + add
strongStr:temp + add
cpyStr:temp
2017-04-10 11:58:56.888 Copy[66562:4610424] tmpStr:0x600000271580
strongStr:0x600000271580
cpyStr:0xa000000706d65744
@property (nonatomic, copy) NSMutableString *mutableString;
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.