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出来分别是几?为什么?
黄舟2017-04-21 10:59:37
먼저 두 개의 출력이 있습니다. 첫 번째는 1이어야 하고 두 번째는 이어야 합니다. . . 아니요, 어쨌든 일반적으로 1보다 큽니다.
그 이유는 이렇습니다.
NSDictionary 인스턴스를 초기화한 후에는 인스턴스가 변경 불가능합니다. 즉, 인스턴스가 생성되면 메모리의 정보가 고정됩니다. 메모리를 절약하기 위해 Objective-C는 동일한 인스턴스의 모든 불변 포인터를 동일한 메모리를 가리킵니다. 따라서 dictB가 빈 NSDictionary를 초기화하면 실제로 새 인스턴스를 생성하지 않고 기록에 있는 기존 인스턴스를 가리키며 이 인스턴스의 RC가 1씩 증가합니다.
dictA로 생성한 첫 번째 개체에는 중복 개체가 없을 것 같으니 이렇게 하면 새 인스턴스가 됩니다.
그러면 인쇄 시 2가 되어야 하며 이는 dictA의 RC + 1입니다.
따라서 변경 가능한 인스턴스는 수명 주기 중 언제든지 변경될 수 있으므로 생성될 때마다 이러한 상황이 발생하지 않습니다.