Вопрос управления памятью - PullRequest
0 голосов
/ 30 августа 2011

Есть ли утечки памяти при установке атрибута следующим образом:

titleView = [[UIWebView alloc] initWithFrame:CGRectMake(10, 0, 300, 5)];

И есть ли разница с

UIWebView *newWebView = [[UIWebView alloc] initWithFrame:CGRectMake(10, 0, 300, 5)];
[self setTitleView:newWebView];
[newWebView release];

Спасибо,

РЕДАКТИРОВАТЬ: Я освобождаю titleView в функции dalloc

Ответы [ 4 ]

1 голос
/ 30 августа 2011

Если у вас есть свойство с именем titleView.

@ property (retain) titleView

Первая утечка, если вы не отпустили ее на dealloc (но будьте осторожны, если вы назначаете больше, чемодин раз)

правильное значение должно быть следующим:

self.titleView =  [[[UIWebView alloc] initWithFrame:CGRectMake(10, 0, 300, 5)] autorelease];

всегда полезно использовать self.propertyName, поскольку оно также освобождает старое значение.

0 голосов
/ 30 августа 2011

Не путайте атрибут с экземпляром и / или локальной переменной.Доступ к атрибуту (или свойству) осуществляется через self, а к переменной экземпляра - напрямую по его имени.

В первом примере произошла утечка, поскольку я не вижу сообщения о выпуске, отправленного на titleView.Если titleView - переменная экземпляра, вы можете освободить ее в методе viewDidUnload.Если он локальный - вы должны освободить его при добавлении в какое-либо представление (как во втором примере).

Во втором примере утечки памяти нет.

0 голосов
/ 30 августа 2011

Предполагая, что вы правильно указали свойство:

@property (nonatomic, retain) UIWebView *titleView;

если сделать:

self.titleView = [[UIWebView alloc] initWithFrame:CGRectMake(10, 0, 300, 5)];

тогда вы протекаете, но когда вы делаете это прямо в иваре, как:

titleView = [[UIWebView alloc] initWithFrame:CGRectMake(10, 0, 300, 5)];

Ты в порядке.

Но вам нужно освободить его в сделке:

- (void)dealloc {
    [titleView release], titleView = nil;
    [super dealloc];
}
0 голосов
/ 30 августа 2011

Если titleView отклонено без атрибута retain , тогда есть разница.

В первом случае все будет хорошо. Во втором - вы не можете использовать titleView после [newWebView release].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...