-retainCount
не является надежным .
Важно: Этот метод обычно не имеет значения при отладке проблем управления памятью.Поскольку любое количество объектов каркаса могло сохранить объект для хранения ссылок на него, в то время как пулы автоматического выпуска могут содержать любое количество отложенных выпусков для объекта, маловероятно, что вы можете получить полезную информацию из этогоmethod.
В вашем случае особая причина в том, что -subview
также приводит к тому, что все подпредставления сохраняются один раз, путем копирования значения .layer.sublayers
в новый массив*:
UILabel* label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
NSLog(@"%d", [label retainCount]); // 1
[someView addSubview:label];
NSLog(@"%d", [label retainCount]); // 2
[someView subviews];
NSLog(@"%d", [label retainCount]); // 3
Не нужно беспокоиться об этом, так как массив автоматически освобождается, а retainCount позже возвращается к 2.Все, что вам нужно, это убедиться, что причина подсчета чистого удержания текущей функцией соответствует статусу владения.
*: Конкретная реализация .subviews
:
-(NSArray*)subviews {
// irrelevant ... snipped
NSArray* sublayers = [_layer.sublayers copy];
int count = [sublayers count];
// irrelevant ... snipped
res = CFArrayCreateMutable(NULL, count, &kCFTypeArrayCallBacks);
for (int i = 0; i < count; ++ i) {
UIView* view = _UIView([sublayers objectAtIndex:i]);
if (view)
CFArrayAppendValue(res, view);
// ^-- this causes an extra -retain to each subview.
}
// irrelevant ... snipped
}