Когда я должен освободить память, если все? - PullRequest
2 голосов
/ 23 мая 2011

Я прочитал все основы распределения / освобождения памяти iOS, но ничего не могу найти по следующему:

Я создал небольшое приложение, которое в значительной степени перечисляет сетку кнопок UIB и нажимая на любую из них, добавляет UIScrollView к текущему представлению контроллера (и добавляет кучу UIView и UIWebView внутри и т. Д.).

При добавлении UIScrollVIew я также добавляю UIButton, который возвращает меня к «домашней сетке», а затем удаляет UIScrollView из суперпредставления. Я освобождаю все вещи, которые я сохраняю / выделяю и т. Д., И когда я проверяю приложение с помощью инструментов, оно не показывает утечки памяти.

Но каждый раз, когда я нажимаю на любой из объектов UIButton, я выделяю больше памяти (в соответствии с инструментами), и она продолжает расти - и «повторное открытие» того же вида UIScrollView с помощью кнопки всегда добавляет больше памяти.

Если я имитирую предупреждение памяти в симуляторе, оно освобождает часть памяти, и я могу затем продолжать его наращивать.

Итак, вот мой вопрос: стоит ли мне пытаться как-то отменить это вручную? И если да, то где я должен это делать? Я довольно новичок в Obj-C, поэтому я думаю, что я охватил большинство основ, но более сложные темы все еще требуют некоторой помощи.

Создание сетки:

UIScrollView *grid = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 1024, 768)];
[[self view] addSubview:grid];
[grid release];

Добавление кнопок (в цикле for):

UIButton *slotItem = [[UIButton alloc] initWithFrame:CGRectMake(((float) slotWidth * j), ((float) slotHeight * i), (float) slotWidth, (float)slotHeight)];
[grid addSubview:slotItem];

UIWebView *buttonWebThumb = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, slotWidth, slotHeight)];

[buttonWebThumb setBackgroundColor:[UIColor clearColor]];
[buttonWebThumb setOpaque:NO];

[buttonWebThumb loadHTMLString:[NSString stringWithFormat:@"%@ %@ %@", htmlTop, [[row objectAtIndex:j] objectAtIndex:1], htmlBottom] baseURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]]];
buttonWebThumb.scalesPageToFit = YES;
[slotItem addSubview:buttonWebThumb];
buttonWebThumb.userInteractionEnabled = NO;
buttonWebThumb.exclusiveTouch = NO;
[buttonWebThumb release];

[slotItem addTarget:self action:@selector(showPages:) forControlEvents:UIControlEventTouchUpInside];

[slotItem release];

Метод showPages затем создает другой UIScrollView и добавляет туда 1-10 отдельных UIWebView и добавляет кнопку «Закрыть» в новый UIScrollView.

Ответы [ 2 ]

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

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

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

- (id) viewExitAction: (id) sender {
  id elem;
  for(elem in buttons) {
    [elem removeSelfFromView];
  }
  // etc
}

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

В противном случае методы viewDidUnload и dealloc никогда не будут вызваны.

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

Dealloc вызывается косвенно через метод release, и вы никогда не должны вызывать его напрямую. Руководство по NSObject для dealloc

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