찾다

 >  Q&A  >  본문

objective-c - [[NSDictionary alloc] init]后引用计数是几

NSDictionary *dictA =[[NSDictionary alloc] initWithObjectsAndKeys:@"1",@"two", nil];
NSLog(@"dictA retain count is %d",[dictA retainCount]);
    
    
NSDictionary *dictB =[[NSDictionary alloc] init];
NSLog(@"dictB retain count is %d",[dictB retainCount]);

问:NSLog出来分别是几?为什么?

黄舟黄舟2769일 전449

모든 응답(1)나는 대답할 것이다

  • 黄舟

    黄舟2017-04-21 10:59:37

    먼저 두 개의 출력이 있습니다. 첫 번째는 1이어야 하고 두 번째는 이어야 합니다. . . 아니요, 어쨌든 일반적으로 1보다 큽니다.
    그 이유는 이렇습니다.
    NSDictionary 인스턴스를 초기화한 후에는 인스턴스가 변경 불가능합니다. 즉, 인스턴스가 생성되면 메모리의 정보가 고정됩니다. 메모리를 절약하기 위해 Objective-C는 동일한 인스턴스의 모든 불변 포인터를 동일한 메모리를 가리킵니다. 따라서 dictB가 빈 NSDictionary를 초기화하면 실제로 새 인스턴스를 생성하지 않고 기록에 있는 기존 인스턴스를 가리키며 이 인스턴스의 RC가 1씩 증가합니다.
    dictA로 생성한 첫 번째 개체에는 중복 개체가 없을 것 같으니 이렇게 하면 새 인스턴스가 됩니다.

    으아아아

    그러면 인쇄 시 2가 되어야 하며 이는 dictA의 RC + 1입니다.

    따라서 변경 가능한 인스턴스는 수명 주기 중 언제든지 변경될 수 있으므로 생성될 때마다 이러한 상황이 발생하지 않습니다.

    회신하다
    0
  • 취소회신하다