iOS 깊이 및 얕은 복사, NSString 메모리 할당
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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.