NSString은 왜 copy를 사용합니까?블락이 왜 코피를 써?

2519 단어

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을 사용하는 것과 다를 것이 없습니다.

좋은 웹페이지 즐겨찾기