2011-11-29 3 views
3

내 프로젝트에서 ARC를 사용합니다. 나는 아래의 코드 테스트 :Xcode 4.2의 ARC에서 __weak 및 autorelease 풀을 사용합니다.

NSString __weak *string; 
@autoreleasepool { 
     string = [NSString stringWithString:@"AAA"]; 
} 

NSLog(@"string: %@", string); 

나는 그것이 출력으로 생각 :

string: (null) 

하지만 실제로 출력 :

string: AAA 

나는 그것을 이해하지 않습니다. __weak의 효과는 무엇입니까?

편집 :

그리고 아래 코드 :

NSString __weak *string; 
NSString __strong *str; 
@autoreleasepool { 
    str = [NSString stringWithFormat:@"%@", @"AAA" ]; 
    string = str; 
} 

NSLog(@"string: %@", string); 

그것은 또한 출력으로 :

string: AAA 

답변

8
NSString __weak *string; 
@autoreleasepool { 
     string = [NSString stringWithFormat:@"%@", @"AAA"]; 
} 

NSLog(@"string: %@", string); 

는 당신이 원하는 것을 다음과 같이 출력합니다.

string: (null) 

따라서,

string = [NSString stringWithString:@"AAA"]; 

는 상기 힙에 할당되지 않은 동일한

string = @"AAA"; 

같은 일정한 캐릭터 문자이다.

편집 :

STR 변수는 오토 릴리즈 객체 여전히 강력한 기준을 갖는다.

다음 코드는 정확히 원하는 것입니다.

NSString __weak *string; 
{ 
    NSString __strong *str; 
    @autoreleasepool { 
     str = [NSString stringWithFormat:@"%@", @"AAA" ]; 
     string = str; 
    } 
} 
NSLog(@"string: %@", string); 

그리고

NSString __weak *string; 
@autoreleasepool { 
    NSString __strong *str; 
    str = [NSString stringWithFormat:@"%@", @"AAA" ]; 
    string = str; 
} 
NSLog(@"string: %@", string); 
+0

귀하의 설명은 완벽합니다. 하지만 EDIT에는 질문이 하나 더 있습니다. 설명해주세요! –

+0

좋아, 업데이트했습니다. –

+0

대단히 감사합니다 !!! –

관련 문제