Нужно ли освобождать ресурсы XIB?

Просто еще одна вещь, чтобы подтвердить, что некоторые люди копируют / вставляют пример кода из Интернета, чтобы начать. Убедитесь, что вы здесь MySQL:

... $dbh = new PDO ("mysql: ...  

В некоторых примерах это показывает

$dbh = new PDO ("dblib ...
37
задан Bill the Lizard 10 November 2008 в 15:03
поделиться

7 ответов

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

@interface MyController : MySuperclass {
    Control *uiElement;
}
@property (nonatomic, retain) IBOutlet Control *uiElement;
@end


@implementation MyController

@synthesize uiElement;

- (void)dealloc {
    [uiElement release];
    [super dealloc];
}
@end

преимущество этого подхода состоит в том, что он делает семантику управления памятью явной и ясной, , и он последовательно работает через все платформы для всех файлов .

пера

Примечание: следующие комментарии применяются только к iOS до 3,0. С 3,0 и позже, Вы должны вместо этого просто ноль значения свойств в viewDidUnload.

Одно соображение здесь, тем не менее, состоит в том, когда Ваш контроллер мог бы избавиться от своего пользовательского интерфейса и перезагрузить его динамично по требованию (например, если у Вас есть контроллер представления, который загружает представление из файла пера, но по запросу - говорят под давлением памяти - выпускает его, с ожиданием, что оно может быть перезагружено, если представление необходимо снова). В этой ситуации Вы хотите удостовериться, что, когда основное представление расположено Вас также, оставляют владение любых других выходов так, чтобы они также могли быть освобождены. Для UIViewController можно заниматься этой проблемой путем переопределения setView: следующим образом:

- (void)setView:(UIView *)newView {
    if (newView == nil) {
        self.uiElement = nil;
    }
    [super setView:aView];
}

, К сожалению, это дает начало дальнейшей проблеме. Поскольку UIViewController в настоящее время реализует dealloc метод с помощью setView:, метод доступа (вместо того, чтобы просто выпустить переменную непосредственно), self.anOutlet = nil назовут в dealloc, а также в ответ на предупреждение памяти... Это приведет к катастрофическому отказу в dealloc.

средство должно гарантировать, что переменные выхода также установлены на nil в [1 110]:

- (void)dealloc {
    // release outlets and set variables to nil
    [anOutlet release], anOutlet = nil;
    [super dealloc];
}
35
ответ дан mmalc 10 November 2008 в 15:03
поделиться

Я нашел то, что я искал в документах Apple. Короче говоря можно настроить объекты как свойства, которые Вы выпускаете и сохраняете (или просто @property, @synthesize), но Вы не имеете к для вещей как UILabels:

http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/LoadingResources/CocoaNibs/chapter_3_section_4.html#//apple_ref/doc/uid/10000051i-CH4-SW18

4
ответ дан rustyshelf 10 November 2008 в 15:03
поделиться
  • 1
    Другие опции являются далеко намного лучшим способом пойти и значительно легче установить – Allen Rice 3 November 2011 в 19:44
0
ответ дан Community 10 November 2008 в 15:03
поделиться
  • 1
    Я был слишком расстроен, когда мы сначала переключились с 2008 - 2010 TFS. Но как только Вы получаете схватывание для изменения шаблона процесса сборки, я думаю you' ll ценят улучшение. – Danny 15 November 2011 в 21:18

Любой IBOutlet, который является подпредставлением основного представления Вашего Nib, не должен быть выпущен, потому что они будут отправлены сообщение автовыпуска после создания объекта. Единственный IBOutlet's, который необходимо выпустить в dealloc, является объектами верхнего уровня как контроллеры или другой NSObject's. Это все упоминается в документе Apple, связанном с вышеупомянутым.

0
ответ дан Eric Allam 10 November 2008 в 15:03
поделиться
  • 1
    спасибо за это. I' m немного перепутанный на данном этапе; куда идет, этот отрывок XML помещается? Какие-либо другие модификации определения Сборки TFS для размещения? – p.campbell 24 January 2011 в 15:52

Вы делаете выделение маркировка, в некотором смысле, путем создания его в IB.

то, Что делает IB, является взглядом на Ваш IBOutlets и как они определяются. Если у Вас будет переменная класса, что IB должен присвоить ссылку на некоторый объект, IB отправит сохранить сообщение в тот объект для Вас.

при использовании свойств IB использует свойство, необходимо установить значение и не явно сохранить значение. Таким образом Вы обычно отмечали бы свойства IBOutlet, как сохраните:

@property (nonatomic, retain) UILabel *lblExample;

Таким образом в случае эфира (использующий свойства или не) Вы должны разъединение вызова в своем dealloc.

0
ответ дан Kendall Helmstetter Gelner 10 November 2008 в 15:03
поделиться
  • 1
    I' m делающий попытку реализации этого, но I' m, не получая метод WriteBuildMessage на контексте, это дополнительный метод от где-нибудь I' m пропавшие без вести? – Chris Surfleet 3 February 2012 в 09:54

[anOutlet release], anOutlet = nil;

Часть является абсолютно лишней, если Вы записали setView: правильно.

3
ответ дан Wil Shipley 11 November 2008 в 01:03
поделиться
  • 1
    Не согласиться. I' d очень скорее вносят это изменение в мой шаблон процесса сборки однажды (для ВСЕХ решений использовать), чем должны отредактировать каждый .proj файл или определение сборки, которое я создаю. – Danny 4 November 2011 в 13:58

Если вы не отпустите его при освобождении, это увеличит объем памяти.

См. Более подробную информацию об инструменте ObjectAlloc graph

1
ответ дан 27 November 2019 в 04:57
поделиться