재미있는 NSString 및 Autorelease

3161 단어 NSString
NSString 객체로 돌아가 이벤트에서 메서드를 호출하는 방법release 메서드로 되돌아오는 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

좋은 웹페이지 즐겨찾기