Утечка распределения элементов UIBbutton - iphone - PullRequest
1 голос
/ 20 мая 2011

Я объявляю свойство для панели инструментов правой кнопки и выделяю его следующим образом:

if(self.toolBar == nil)
    self.toolBar = [[UIBarButtonItem alloc] initWithCustomView:tools];
    self.navigationItem.rightBarButtonItem = self.toolBar;


- (void)viewDidUnload {
    toolBar = nil;
}

- (void)dealloc {
    [toolBar release];
    [super dealloc];     
}

Когда я прихожу на этот экран во второй раз (во второй раз вызывается viewDidLoad), UIBarbuttonItem протекает в соответствии с инструментами,Что может быть не так?

Спасибо за всю вашу помощь заранее.

Ответы [ 2 ]

2 голосов
/ 20 мая 2011

Вы обнуляете свойство панели инструментов преждевременно - viewDidUnload будет вызываться перед dealloc, таким образом, у dealloc не будет возможности отпустить кнопку, потому что toolBar указывает на nil, а не на объект (который будетостаются в собственности (количество выпусков не менее 1), но без ссылки).

Плюс, поскольку вы не используете точечную запись (self.toolBar) для обнуления свойства, счетчик выпусков старых объектов не будетбыть уменьшенным!Таким образом, число сохраняемых им элементов равно как минимум 2 на момент выхода из контроллера.

Я бы выпустил объект сразу после присвоения его свойству, потому что метод setter сохранил его в любом случае (если вы решите сохранитьэто в декларации).Позже в viewDidUnload все, что вам нужно сделать, это self.toolBar = nil;, чтобы действительно избавиться от него.

1 голос
/ 20 мая 2011

Полагаю, ваша собственность похожа на эту?

@property (nonatomic, retain) IBOutlet UIBarButtonItem toolBar;

Это автоматически выполнит сохранение для вас, но вы отдаете свою собственность уже сохраненному предмету toobar.

Попробуйте вместо этого:

if(toolBar == nil)
    toolBar = [[UIBarButtonItem alloc] initWithCustomView:tools];
    self.navigationItem.rightBarButtonItem = self.toolBar;

Если вы не используете self., оно не будет использовать свойство, и поэтому у него не будет этого дополнительного удержания:)

...