Я создал пустое приложение для iOS на Xcode 4.4.1 и сделал следующее:
NSNumber *n1 = @1;
NSNumber *n2 = @2;
NSNumber *n3 = @3;
NSNumber *n100 = @100;
NSString *s = @"haha";
NSArray *a = @[n1, s];
NSDictionary *d = @{ @"ha" : @1, @3 : @"hello" };
NSLog(@"retain count of @1 is %i", [n1 retainCount]);
NSLog(@"retain count of @2 is %i", [n2 retainCount]);
NSLog(@"retain count of @3 is %i", [n3 retainCount]);
NSLog(@"retain count of @100 is %i", [n100 retainCount]);
NSLog(@"retain count of @\"haha\" is %i", [s retainCount]);
NSLog(@"retain count of array literal is %i", [a retainCount]);
NSLog(@"retain count of dictionary literal is %i", [d retainCount]);
и результат:
retain count of @1 is 10
retain count of @2 is 4
retain count of @3 is 5
retain count of @100 is 1
retain count of @"haha" is -1
retain count of array literal is 1
retain count of dictionary literal is 1
поэтому счетчик сохранения литерала массива и литерала словаря равен 1, а строковый литерал, как говорят, существует для всего запущенного приложения, поэтому он равен -1 (вероятно, это означает MAX unsigned int), но на самом деле выходит счетчик сохранения @1
как 7, 8 и 10 в разное время. Есть ли какое-то правило? Я обнаружил, что также могу выполнять [n1 retain]
и [n1 release]
, и это будет соответственно увеличивать и уменьшать количество удержаний.
retainCount
вообще? На самом деле, в большинстве случаев они действительно показывают значение, которое должно быть. - person Jeremy L   schedule 14.09.2012retainCount
вообще? Никто не знает. - person BoltClock   schedule 15.09.2012