Objective-c에서 'copy'와 'retain'의 차이점을 연구 중입니다. 그러나 나는 'copy'방법이 새로운 메모리 주소를 열지 않는 이유에 대해 의심의 여지가있다. 내가 사람이라는 새 클래스를 생성, 그러나'copy'및 'retain'에 대한 세부 정보
2014-09-29 17:30:52.730 SEL_Demo[987:303] 0x100301030, Hello, World !
2014-09-29 17:30:52.731 SEL_Demo[987:303] 0x100301030, Hello, World !
2014-09-29 17:30:52.731 SEL_Demo[987:303] 0x100301030, Hello, World !
을,이에 위임 구현 :
NSString *aString = [NSString stringWithFormat:@"Hello, World !"];
NSLog(@"%p, %@", aString, aString);
NSString *bString = [aString copy];
NSLog(@"%p, %@", bString, bString);
NSString *cString = [aString retain];
NSLog(@"%p, %@", cString, cString);
[aString release];
[bString release];
[cString release];
결과
은 다음과 같습니다 주요 파일에 다음- (id) copyWithZone:(NSZone *)zone
{
return [[[self class] allocWithZone:zone] init];
}
를 :
Person *person = [[Person alloc] init];
NSLog(@"%p",person);
Person *aPerson = [person copy];
NSLog(@"%p", aPerson);
Person *bPerson = [person retain];
NSLog(@"%p", bPerson);
그 결과는 다음과 같습니다 :
2014-09-29 19:02:50.248 SEL_Demo[1133:303] 0x10010a860
2014-09-29 19:02:50.250 SEL_Demo[1133:303] 0x1003007f0 //different memory address.
2014-09-29 19:02:50.250 SEL_Demo[1133:303] 0x10010a860
어떤 도움이나 조언을 주시면 감사하겠습니다.
'bString'에 새 메모리 주소가없는 이유에 대해 혼란 스럽습니다. –
'NSString'은 변경 불가능하므로 변경할 수 없습니다. 동일한 불변 객체를 나타 내기 위해 새 객체를 할당 할 필요가 없습니다. 완벽하게 구현되는 경우, 정확히 "Hello World!"값을 갖는 NSString의 인스턴스가 하나있을 것입니다. 런타임이'NSString'을 탐지 할 때마다, 그 값을 가진 유일한 인스턴스를 사용할 수 있습니다. 그러나 실제 환경에서는'NSString' 구현체가 항상'retain'과'copy'에서'self'를 리턴 할 수 있습니다. 이것은 당신이 여기서 보았던 것입니다. –