iPhone: у меня проблемы с итеративным наращиванием памяти - PullRequest
1 голос
/ 07 июля 2011

У меня проблемы с созданием памяти, и я не могу очистить ее, как только с ней покончено. Когда я смотрю на диагностический инструмент «: Распределения: Инструменты: Сводка объектов: статистика», память просто непрерывно накапливается.

пример:

for (int i=0; i<100000; i++){
    UILabel *lblPost = [[UILabel alloc] initWithFrame:CGRectMake(x,y,w,d)];
    [lblPost setText: "Hello World"];
    [self.view addSubview: lblPost];

    // tried each of the following
    //[lblPost dealloc]; //neither work to clear memory it just builds
    //[lblPost release]; //
}

-> Мне нужно отделить CGRect и очистить это.

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

-> (Мне трудно поверить, что я не могу создать объект и затем уничтожить его 10000 или 100000000 раз. В стандарте C я могу сделать это с помощью блоков памяти, используя "free ()")

Ответы [ 5 ]

3 голосов
/ 07 июля 2011

Представление, к которому вы добавляете ярлык, сохраняет его, поэтому каждый из ярлыков не освобождается (даже если вы отправляете сообщение о выпуске)

2 голосов
/ 07 июля 2011

Может быть, я действительно не понимаю, что вы пытаетесь сделать, но каждый ваш отдельный объект, который вы выделяете, сохраняется в представлении.Позвольте мне попытаться объяснить это в коде:

 for (int i=0; i<10000; i++){
  UILabel *lblPost = [[UILabel alloc] initWithFrame:CGRectMake(x,y,w,d)];
 // lblPost now has a retain count of 1, as you alloc'd it, you'll have to release it!
  [lblPost setText: "Hello World"];
  [self.view addSubview: lblPost];
 // lblPost now has a retain count of 2, as adding to the view adds a reference to it
  [lblPost release]
 // you alloc'd it, now you should release it. it now has a retain count of 1, which means it's in the ownerhsip of the self.view
}

Теперь, когда вы выпускаете или освобождаете self.view, объекты lblPost также должны быть освобождены

1 голос
/ 07 июля 2011

Почему вы выделяете память для 10000 UILabel с и , добавляя их как подпредставление точно?Это пытка iPhone.Элементы, выделенные жирным шрифтом, вызывают всплеск памяти.Кроме того, вы не выпускаете ни одного из них .

Также - никогда - никогда не звоните dealloc себе - dealloc вызывается автоматически, когда вы release что-то.

enter image description here

0 голосов
/ 07 июля 2011

Это весело! Я решил вскочить. Я разместил это в своих комментариях, но здесь это снова:

Я думаю, что Мадху неправильно понял [выпуск lblPost]. Этот «релиз» относится только к экземпляру lblPost. Не те, что сохранены в self.view ... и т. Д. Таким образом, у вас все еще есть 10000 ярлыков, сохраненных в self.view ...

Итак, вы создаете 10000 экземпляров lblPost, а затем освобождаете их все (10000) этой строкой [lblPost release] в цикле for. Это просто отлично. Но тогда в вашем цикле for у вас также есть эта строка [self.view addSubview: lblPost]. Эта строка добавит 10000 экземпляров в ваш self.view. И они являются причиной сбоя вашей системы.

0 голосов
/ 07 июля 2011
for (int i=0; i<10000; i++){
    UILabel *lblPost = [[UILabel alloc] initWithFrame:CGRectMake(x,y,w,d)];
    [lblPost setText: "Hello World"];
    [self.view addSubview: lblPost];

    [lblPost release];
    //You should release after adding it to your view


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