2014-09-29 4 views
0

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 

어떤 도움이나 조언을 주시면 감사하겠습니다.

답변

0

나는 당신이 NSString의 불변 성을보고 있다고 믿습니다. This answer은 스택에 할당 될 때 동일한 주소를 갖는 두 개의 개별적인 NSString 개체의 예를 기록합니다. copyretain은 변경할 수 없으므로 불변 값에 대해서만 self을 반환한다고 가정합니다.

+0

'bString'에 새 메모리 주소가없는 이유에 대해 혼란 스럽습니다. –

+0

'NSString'은 변경 불가능하므로 변경할 수 없습니다. 동일한 불변 객체를 나타 내기 위해 새 객체를 할당 할 필요가 없습니다. 완벽하게 구현되는 경우, 정확히 "Hello World!"값을 갖는 NSString의 인스턴스가 하나있을 것입니다. 런타임이'NSString'을 탐지 할 때마다, 그 값을 가진 유일한 인스턴스를 사용할 수 있습니다. 그러나 실제 환경에서는'NSString' 구현체가 항상'retain'과'copy'에서'self'를 리턴 할 수 있습니다. 이것은 당신이 여기서 보았던 것입니다. –

0

copy은 반드시 새로운 개체를 제공하지 않습니다. 변경 불가능한 클래스는 유지되는 동일한 객체를 제공하여 구현할 수 있습니다. 그것이 같은 대상인지 여부는 신경 쓰지 않아야합니다.

관련 문제