iOS 깊이 및 얕은 복사, NSString 메모리 할당

5975 단어
copy와 retain의 차이점:
1) copy는 새 대상을 만들고,retain은 포인터를 만들고, 인용 대상의 계수는 1을 추가합니다.Copy 속성은 두 대상의 내용이 같고 새 대상retain은 1이며 기존 대상의 인용 계수와 상관없이 기존 대상은 변하지 않습니다.copy는 상하문에 대한 대상의 의존을 감소합니다.
2)retain 속성은 두 대상의 주소가 같다는 것을 나타낸다(바늘을 만들고 바늘로 복사한다). 내용은 당연히 같다. 이 대상의retain 값+1은 즉,retain은 바늘로 복사하고copy는 내용 복사이다.
#pragma mark - iOS            retain copy
        //     (NSString / NSNumber )
        NSString *str1 = [[NSString alloc] initWithFormat:@"%@", @"Jacedy"];
        NSString *str11 = [str1 retain];
        NSString *str12 = [str1 copy];
        NSString *str13 = [str1 mutableCopy];
        
        NSMutableString *str2 = [[NSMutableString alloc] initWithString:@"Jake"];
        NSMutableString *str21 = [str2 retain];
        NSMutableString *str22 = [str2 copy];
        NSMutableString *str23 = [str2 mutableCopy];
        
        NSLog(@"    ");
        NSLog(@"str1    :%p,retainCount:%lu", str1, (unsigned long)[str1 retainCount]);
        NSLog(@"str11   :%p,retainCount:%lu", str11, (unsigned long)[str11 retainCount]);
        NSLog(@"str12   :%p,retainCount:%lu", str12, (unsigned long)[str12 retainCount]);
        NSLog(@"str13   :%p,retainCount:%lu

", str13, (unsigned long)[str13 retainCount]);         NSLog(@"str2  :%p,retainCount:%lu", str2, (unsigned long)[str2 retainCount]);         NSLog(@"str21 :%p,retainCount:%lu", str21, (unsigned long)[str21 retainCount]);         NSLog(@"str22 :%p,retainCount:%lu", str22, (unsigned long)[str22 retainCount]);         NSLog(@"str23 :%p,retainCount:%lu

", str23, (unsigned long)[str23 retainCount]);                  //  ( )(NSArray / NSSet )         NSArray *arr1 = [NSArray arrayWithObjects:@"one", @"two", nil];         NSArray *arr11 = [arr1 retain];         NSArray *arr12 = [arr1 copy];         NSArray *arr13 = [arr1 mutableCopy];                  NSMutableArray *arr2 = [NSMutableArray arrayWithObjects:@"one", @"two", nil];         NSMutableArray *arr21 = [arr2 retain];         NSMutableArray *arr22 = [arr2 copy];         NSMutableArray *arr23 = [arr2 mutableCopy];                  NSLog(@" ");         NSLog(@"arr1  :%p,retainCount:%lu", arr1, (unsigned long)[arr1 retainCount]);         NSLog(@"arr11 :%p,retainCount:%lu", arr11, (unsigned long)[arr11 retainCount]);         NSLog(@"arr12 :%p,retainCount:%lu", arr12, (unsigned long)[arr12 retainCount]);         NSLog(@"arr13 :%p,retainCount:%lu", arr13, (unsigned long)[arr13 retainCount]);         NSLog(@"arr1[0] :%p", arr1[0]);         NSLog(@"arr13[0]:%p

", arr13[0]);                  NSLog(@"arr2  :%p,retainCount:%lu", arr2, (unsigned long)[arr2 retainCount]);         NSLog(@"arr21 :%p,retainCount:%lu", arr21, (unsigned long)[arr21 retainCount]);         NSLog(@"arr22 :%p,retainCount:%lu", arr22, (unsigned long)[arr22 retainCount]);         NSLog(@"arr23 :%p,retainCount:%lu", arr23, (unsigned long)[arr23 retainCount]);         NSLog(@"arr2[0] :%p", arr2[0]);         NSLog(@"arr22[0]:%p

", arr22[0]);          #pragma mark - NSString                   NSString *string1 = @"Jacedy";         NSString *string2 = [[NSString alloc] initWithString:@"KJacedy"];         NSString *string3 = [[NSString alloc] initWithFormat:@"Jacedy"];         NSString *string4 = [NSString stringWithFormat:@"K-Jacedy"];         //NSString *string5 = [NSString stringWithString:@"Jacedy"];    // string1         NSLog(@"NSString ");         NSLog(@"string1:%p retainCount:%lu  class:%@", string1, [string1 retainCount], [string1 class]);         NSLog(@"string2:%p retainCount:%lu  class:%@", string2, [string2 retainCount], [string2 class]);         NSLog(@"string3:%p retainCount:%lu  class:%@", string3, [string3 retainCount], [string3 class]);         NSLog(@"string4:%p retainCount:%lu  class:%@

", string4, [string4 retainCount], [string4 class]);
//     :

    
str1    :0x79646563614a65,retainCount:18446744073709551615
str11   :0x79646563614a65,retainCount:18446744073709551615
str12   :0x79646563614a65,retainCount:18446744073709551615
str13   :0x100203a70,retainCount:1

str2    :0x100203f20,retainCount:2
str21   :0x100203f20,retainCount:2
str22   :0x656b614a45,retainCount:18446744073709551615
str23   :0x100204040,retainCount:1

   
arr1    :0x100300a90,retainCount:3
arr11   :0x100300a90,retainCount:3
arr12   :0x100300a90,retainCount:3
arr13   :0x100301190,retainCount:1
arr1[0] :0x1000021b0
arr13[0]:0x1000021b0

arr2    :0x100301260,retainCount:2
arr21   :0x100301260,retainCount:2
arr22   :0x100301370,retainCount:1
arr23   :0x100301390,retainCount:1
arr2[0] :0x1000021b0
arr22[0]:0x1000021b0

NSString    
string1:0x100002050 retainCount:18446744073709551615  class:__NSCFConstantString
string2:0x100002390 retainCount:18446744073709551615  class:__NSCFConstantString
string3:0x79646563614a65 retainCount:18446744073709551615  class:NSTaggedPointerString
string4:0xd2eec83802a585 retainCount:18446744073709551615  class:NSTaggedPointerString

Program ended with exit code: 0

심층 복사와 얕은 복사 결론:
1) 비컬렉션 클래스:
[immutableObject copy]//얕은 복사
[immutableObject mutableCopy]//깊이 복사
[mutableObject copy]//깊이 복사
[mutableObject mutableCopy]//깊이 복사
         
2) 컬렉션 클래스:
[immutableObject copy]//얕은 복사
[immutableObject mutableCopy]//단층 깊이 복제(즉 대상 자체만 내용 복제하고 대상 요소는 바늘 복제(메모리는 변하지 않음)
[mutableObject copy]//단일 레벨 딥 클로닝
[mutableObject mutableCopy]//단일 레벨 딥 클로닝
         
NSString 메모리 할당 결론:
@''및 initWithString: 방법으로 생성된 문자열은 상수 구역에 분배되고 시스템은 자동으로 메모리를 관리합니다.
initWithFormat:stringWithFormat:방법으로 생성된 문자열은 더미에 분배되고autorelease

좋은 웹페이지 즐겨찾기