재미있는 NSString 및 Autorelease
3161 단어 NSString
-(NSString*) createNewString{
// 1
return [[[NSString alloc] initWithFormat:@"%@",@"1223344"] autorelease];
// 2
return [[[NSString alloc] initWithString:@"1223344"] autorelease];
// 3
return @"1223344";
}
// ,
- (IBAction)TouchDown:(id)sender {
NSString* str = [self createNewString];
NSLog(@" 1 , count : %d" , [str retainCount]);
[str release];
NSLog(@" 2 , count : %d" , [str retainCount]);
}
시나리오 1:
2011-09-08 21:33:38.817 AutoRelease [718:b303] 출력 1 count: 12011-09-08 21:33:38.819 AutoRelease [718:b303] *** - [CFString retainCount]: 메시지 sent to deallocated instance 0x4e 50c60
이 때 xcode 인터럽트가 출력 2에 머물러 있습니다...출력 2포착인 줄 알았는데.회수된 대상은 실행 방법인retainCount을 실행할 수 없습니다.(단순 회수와nil의 차이가 있는지 다음 학습)
주석 출력 2
결과는 다음과 같습니다.
2011-09-08 21:35:02.690 AutoRelease [745:b303] 출력 1 count: 12011-09-08 21:35:02.692 AutoRelease [745:b303] *** - [CFString release]: 메시지 sent to deallocated instance 0x6895940
단점은 이미main방법중으로 갔어요.이 때 [str release]로 확인합니다.방법이 틀리다.autorelease의 대상에 대한 이해.수동으로release 조작을 할 수 없습니다.
호출 방법을 수정하려면 다음과 같이 하십시오.
- (IBAction)TouchDown:(id)sender {
NSString* str = [[self createNewString] retain];
NSLog(@" 1 count : %d" , [str retainCount]);
[str release];
NSLog(@" 2 count : %d" , [str retainCount]);
}
이 때 방법이 통과되어 이상이 없습니다.출력:
2011-09-08 21:40:42.029 AutoRelease[804:b303] 출력 1 count: 22011-09-08 21:40:42.030 AutoRelease[804:b303] 출력 2 count: 1
autorelease의 대상을 조작해야 할 때먼저 Retain을 할 수 있고, 그 다음에 그를 필요로 하지 않을 때,release를 할 수 있다.(이건 대상 소유권의 문제)...retain = = 카운터 +1
----------------------------------- ----------------------------------- ----------------------------------- -----------------------------------
상황2, 상황3: 방법은 수정 전과 수정 후 두 가지 코드에서 모두 실행될 수 있다.
출력은 다음과 같습니다.
2011-09-08 21:49:16.993 AutoRelease[864:b303] 출력 1 count: 2147483647 2011-09-08 21:49:16.995 AutoRelease[864:b303] 출력 2 count: 2147483647
initWithString: @ "1223344"로 이해하고 상수 문자열을 만들었습니다.시스템에release와retain이 불가능한 대상으로 한정됩니다.약간 애플이 추천하는 단례 모드 같아요.
참고: 2147483647은 UINT 입니다.MAX 값
리턴[[[[NSString alloc] init] stringBy Appending String: @ "Hello World!"
이거 안에 메모리 유출이 있을까요?계속 연구하면..
참조할 수 있는 항목:http://stackoverflow.com/questions/1390334/nsstring-retain-count
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
NSString 크기 캡처 구멍sizeWithAttributes 정확한 크기를 얻을 수 없습니다. 문자열에 지정한 글꼴에 없는 것이 포함되어 있으면 sizeWithAttributes 정확한 크기를 얻을 수 없습니다. 예를 들어, 등가 배율 글꼴 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.