айфон почему я сливаю объект? - PullRequest
1 голос
/ 09 марта 2011

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

Это следующий код:


UIButton * plus = [[UIButton buttonWithType:UIButtonTypeRoundedRect] retain];
[plus setTitle:@"+" forState:UIControlStateNormal];
[plus addTarget:self action:@selector(plusClicked:) forControlEvents:(UIControlEvents)UIControlEventTouchDown];
plus.frame = CGRectMake(x+35, y-30, 35, 30);
plus.tag = i;
[self.view addSubview: plus];
[plus release];

(переменные x / y / i и т. Д. Определены выше и не имеют отношения к этому коду).

Кто-нибудь может объяснить, почему я сливаю объект «плюс», согласно приборам / утечкам?

Ответы [ 5 ]

1 голос
/ 09 марта 2011

Этот небольшой кусочек кода остается на кнопке плюса три раза.Один раз при создании кнопки, один раз в явном виде и один раз в addSubView :.

Этот код также автоматически выпускает кнопку «плюс» один раз и отпускает ее один раз.(Как упоминалось в других ответах, явные вызовы сохранения / выпуска не нужны, но сбалансированы, поэтому не вызывают утечку.) Либо вы не уравновешиваете сохранение в addSubView: с выпуском, либо пул авто-выпуска не очищается.Возможное решение - отправить сообщение release (или, возможно, removeFromSuperview) объекту плюса перед освобождением содержащего представления.Другое возможное решение - убедиться, что пул авто-релиза активен во время выполнения этого кода.Просто чтобы проверить, вы можете добавить NSAutoreleasePool перед вашим кодом, а затем слить пул примерно так:

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

// your code

[pool release];

Если это исправит это, проверьте структуру вашего кода, чтобы выяснить, почему ваш пул автоматического выпускане истощает.

1 голос
/ 09 марта 2011

1) Недостаточно информации, чтобы сказать наверняка, но я предполагаю, что это потому, что экземпляр вашего контроллера (или его представление) протекает, потому что после [plus release] единственным владельцем этой кнопки является представление контроллера.* 2) Вам не нужно сохранять автоматически выпущенные объекты для работы с ними в локальной области - они гарантированно сохранятся до истечения пула автоматического выпуска (что происходит в конце обработки событий в вашем случае).

0 голосов
/ 10 июня 2011

удалить retain, из UIButton * plus = [[UIButton buttonWithType:UIButtonTypeRoundedRect] retain];
и удалить [plus release];

0 голосов
/ 09 марта 2011

Только из фрагмента кода, который вы разместили, это не похоже на утечку.Если вы удалите строку выпуска, как это было предложено makboney, вы также должны удалить кнопку сохранения плюса в начале.Нет причин сохранять его, потому что он возвращается автоматически освобожденным, и вы, очевидно, не планируете сохранять владельца дольше, чем несколько строк кода;)

Попробуйте запустить статический анализатор (Build-> Analyze), может бытьэто расскажет вам больше об утечке.

0 голосов
/ 09 марта 2011

Потому что вы не выделяете эту кнопку (плюс кнопка). Если вы не распределяете деньги, вы не должны выпускать это. Удалить [плюс выпуск];

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