0

코드에서 객체를 생성 등록 obj가 외부에서 내부 @autoreleasepool 블록에 있지 오토 릴리즈 왜는 외부 @autoreleasepool 블록과 이상한 __weak 포인터 동작

For __autoreleasing objects, the new pointee is retained, autoreleased, and stored into the lvalue using primitive semantics. 

?

번째 예 :

@autoreleasepool { 

     id __weak obj = nil; 

     @autoreleasepool { 
      id __strong obj1 = [[NSObject alloc] init]; 
      obj = obj1; 

      NSLog(@"obj: %@", obj); // <NSObject: 0x7857657> 
      NSLog(@"obj retain count: %d", (int) _objc_rootRetainCount(obj1)); // 2 

      _objc_autoreleasePoolPrint(); 
     } 

     NSLog(@"obj retain count: %d", (int) _objc_rootRetainCount(obj)); // 1 
     NSLog(@"obj: %@", obj); // (null) 

     _objc_autoreleasePoolPrint(); 
    } 

왜 NSLog 출력 "(널)"수를 보유하는 경우 1?

답변

1

obj가 바깥 쪽이 아닌 안쪽의 @autoreleasepool 블록에서 자동으로 렌더링되는 이유는 무엇입니까?

목적은 obj (obj = [[NSObject alloc] init];) 상기 과제 오토 릴리즈되기 때문에, 그것은 최상위 (최) 오토 릴리즈 풀에 넣고, 그 풀이 고갈 될 때합니다 (@autoreleasepool 블록의 끝에서) 해제된다.

왜 NSLog는 보유 개수가 1이면 "(null)"을 출력합니까?

_objc_rootRetainCount()은 문서화 된 기능이 아닙니다. 외관상으로는 _objc_rootRetainCount(nil)은 1로 평가됩니다.

+0

ok. 감사. 하지만 왜 (null)이 인쇄되고 있는지 대답을 얻지 못했습니다. – AndrewShmig

+0

@AndrewShmig :'obj'가 null이기 때문에 ('nil') – newacct