Перезапуск, выделение и ноль объектов?

#ios #objective-c #memory-management #null

#iOS #objective-c #управление памятью #null

Вопрос:

Это правильный способ обработки памяти?

Способ 1: без сбоев

  UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(220.0f, 7.0f, 57.0f, 35.0f)] ;

    button = nil;

    [button release];
  

Способ 2: с аварийным завершением

  UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(220.0f, 7.0f, 57.0f, 35.0f)] ;

   [button release];

   button = nil;
  

Ответ №1:

Нет необходимости устанавливать переменной, содержащей выделенный вами объект, значение nil. Просто отпустите его, если оно вам больше не нужно. Вот и все.

Комментарии:

1. Хорошей практикой является установка переменной значения nil, поскольку в противном случае, если вы позже отправите сообщение переменной, вы получите сбой, потому что вы пытались отправить сообщение освобожденному экземпляру. Если вы установите значение nil, вы просто получите нулевой результат, и программа продолжит работу. Попробуйте NSMutableString *str = [[NSMutableString alloc]initWithString:@"bla"]; NSLog(@"rc = %d",[str retainCount]); [str release]; str = nil; NSLog(@"rc = %d",[str retainCount]); — это запустится. Завершите str = nil , и вы получите сбой.

Ответ №2:

Первое неверно, и имеет место утечка памяти.

Второй метод используется большинством из нас, и он не должен вызывать сбоев,

Опубликуйте соответствующий код с помощью метода # 2.

Комментарии:

1. Нет. Вы не должны использовать init с UIButton, но вместо этого используйте buttonWithType: .

2. @ Eiko: использование buttonWithType не обязательно, это просто одно из предпочтительных требований для разработчика. также может быть использован метод init .

3. В документе Apple говорится по-другому. И вы не сможете установить тип кнопки позже. Доступно только для чтения.

Ответ №3:

Оба неверны. Вы должны использовать метод класса buttonWithType : для создания кнопок. Он установит тип, указанный вами. Кнопки не должны выделяться напрямую. (Возможно, именно отсюда происходит сбой, хотя этого не должно быть)

Метод класса вернет автоматически освобожденный объект, поэтому вы не должны его освобождать.

Несмотря на это (то есть с другими объектами и обычным выделением / инициализацией), второй способ правильный; первый протекает.

Ответ №4:

Почему вы устанавливаете для button = nil; кнопки значение nil, после [button release]; вам не нужно этого делать, просто сделайте [button release]; , и ваша кнопка будет выпущена без каких-либо утечек.

Комментарии:

1. Потому что кто-то мог сохранить эту переменную и все еще пытаться ее использовать, что приведет к сбою, если вы не установили значение nil; смотрите Мой комментарий к ответу unset .