2014-01-16 5 views
1

ARC 코드에서 __weak가 어떻게 작동하는지 이해하려고합니다. 내가 NSLog 나에게 "무기 호"를 보여줍니다 것으로 기대ARC 코드의 __weak 예제

NSString *string = @"Hi!"; //1 
__weak NSString *secondString = string; //2 
string = @"Hello world!"; //3 

NSLog(@"STR: %@", secondString); //4 

하지만 보여줍니다 여기 내 예입니다 "안녕!". 왜? 이 문자열은 세 번째 줄에서 할당 해제되어야합니다.

답변

4

문자열은 정적이며 결코 해제되지 않습니다. 수동으로 할당 된 개체를보십시오 :

#import <Foundation/Foundation.h> 

int main() 
{ 
    NSObject* strongPtr = [NSObject new]; 
    NSObject* __weak weakPtr = strongPtr; 
    NSLog(@"weak=%@", weakPtr); 

    strongPtr = nil; 
    NSLog(@"weak=%@", weakPtr); 
} 

출력은

2014-01-16 15:07:49.376 a.out[34078:507] weak=<NSObject: 0x7fe391c08230> 
2014-01-16 15:07:49.379 a.out[34078:507] weak=(null) 

이 같은 테스트가 실패 나타날 수 있습니다 왜 또 다른 일반적인 이유해야한다는 오토 릴리즈 풀이다 - API를 어떤 장면 뒤에 객체를 autorelease를하는 경우, nil이되는 약한 포인터를 보려면 이벤트 루프의 다음 홉까지 기다려야 할 수 있습니다.

+2

특히 약한 변수를 읽는 것만으로 값이 로컬 자동 해제 풀에 유지 될 수 있습니다. –

4

상수 문자열은 ARC에 대해 알아보기에 좋지 않은 방법입니다. 로깅은 ARC에 대해 배우는 나쁜 방법입니다.

상수 문자열은 효과적으로 단독 요소이므로 결코 해제되지 않습니다.

로깅은 모르는 방식으로 변수를 캡처합니다.

디버그 빌드는 약한 참조를 즉시 제거하지 않습니다.

기본적으로 이와 같은 독립형 기능에서 ARC에 대한 "테스트"는 거의 할 수 없습니다.