UIButton сохраняет увеличение счетчика после касания - PullRequest
0 голосов
/ 14 июня 2011

Я создал набор объектов того же пользовательского типа. Все объекты имеют методы showDeleteButton has hideDeleteButton. Я обнаружил, что когда я скрываю кнопку удаления (удаляет ее), кнопка, которая была нажата, имеет retainCounter == 2.

Вот код:

-(void)showDeleteButton {
if(!isDeleteButtonLoaded) { // Check that method was't triggered twice
    UIButton *aDeleteButton = [[UIButton alloc] initWithFrame:CGRectMake(-3, -7, 30, 29)]; // RC == 1
    [aDeleteButton setImage:[UIImage imageNamed:@"close_button.png"] forState:UIControlStateNormal];
    [self addSubview:aDeleteButton]; // RC == 2
    [aDeleteButton addTarget:self action:@selector(deleteButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
    deleteButton = aDeleteButton;
    [aDeleteButton release]; // RC == 1
    isDeleteButtonLoaded = YES;
    NSLog(@"delete button retain count (created): %d", [deleteButton retainCount]);
    [self setNeedsDisplay];
}

}

-(void)deleteButtonPressed:(id)sender {
[delegate deleteImageAtPath:self.imageFullPath];

}

-(void)hideDeleteButton {
if(isDeleteButtonLoaded) {
    NSLog(@"delete button retain count (before): %d", [deleteButton retainCount]); // RC == 1
    [deleteButton removeFromSuperview]; // RC == 0
    deleteButton = nil;
    isDeleteButtonLoaded = NO;
    [self setNeedsDisplay];
}

}

Так что для нажатой кнопки NSLog во втором методе отображается RC == 2! Есть идеи? Я на 100% уверен, что deleteButton недоступен извне класса.

Ответы [ 4 ]

5 голосов
/ 14 июня 2011

НЕ СМОТРЕТЬ НА ОСТАВШУЮСЯследуя правилам памяти, все будет хорошо.

0 голосов
/ 14 июня 2011

Никогда не используйте retainCount.В лучшем случае результаты вводят в заблуждение.

Первый порядок работы, прочитайте Рекомендации Apple по управлению памятью .

Во-вторых, используйте эти рекомендации для устранения некоторых проблем с памятью в вашем коде:

UIButton *aDeleteButton = [[UIButton alloc] initWithFrame:CGRectMake(-3, -7, 30, 29)];
// Retain count +1
// Some code...
deleteButton = aDeleteButton;
[aDeleteButton release];
// Retain count -1

Вы выделяете новый UIButton, а затем отпускаете его.Это означает, что кнопка НЕ ​​принадлежит вам и может исчезнуть в любое время.Я предполагаю, что у вас есть свойство в вашем классе под названием deleteButton?Если это так, используйте его следующим образом: self.deleteButton = aDeleteButton;

В вашем методе hideDeleteButton вы, вероятно, захотите использовать что-то похожее на это:

[self.deleteButton removeFromSuperview];
self.deleteButton = nil;
isDeleteButtonLoaded = NO;
[self setNeedsDisplay];

Опять же, это предполагает, что выесть свойство в вашем классе с именем deleteButton.Если у вас его нет, сделайте его и используйте.Это значительно упрощает задачи управления памятью.

0 голосов
/ 14 июня 2011

См. Этот стековый поток популярный вопрос о том, почему никогда не использовать retainCount и вместо этого использовать инструменты Apple для отслеживания утечек памяти.

0 голосов
/ 14 июня 2011

Никогда не смотрите на retainCounts для получения полезной информации.Во внутренней структуре Apple они могут вызывать сохранение или освобождение ваших объектов в любое время.Все, о чем вам нужно беспокоиться, это то, что ваши операторы retain (или alloc, or copy) и release соответствуют друг другу.Добавление представления как подпредставления другого представления (или добавление его в любой NSArray) также увеличит его retainCount ... хотя вам не нужно об этом беспокоиться.

...