Выпуск объектов еще не был выпущен на Objective-C - PullRequest
1 голос
/ 13 февраля 2012

Я пытаюсь создать метод для освобождения объектов, которые я еще не выпустил по какой-либо причине.Я добавляю это в метод dealloc моего ViewController:

for (id object in [self.view subviews]){
    NSLog(@"/n") ;
    NSLog(@"%@", object) ;

    if([object isKindOfClass:[UIView class]]){
        if (malloc_size(object)>0) {
            NSLog(@"-> Releasing object with size: %zd", malloc_size(object)) ;    
            [object release] ;
        }
    }
}

К сожалению, приложение вылетает.Что я делаю не так?

Ответы [ 3 ]

4 голосов
/ 13 февраля 2012

Что я делаю не так?

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

В этом коде, в частности, вы освобождаете все подпредставления своего представления. Сохранял ли ваш код все эти представления? Если нет, вы не должны выпускать их. Если да, , почему ? Вы храните отдельные ссылки на каждый? Ваше представление сохранит все представления, которые вы добавите в качестве подпредставлений; вам нужно только сохранить их, если у вас есть другие ссылки на них (и некоторые люди предпочитают не сохранять даже тогда).

1 голос
/ 13 февраля 2012

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

И вам не следует этого делать, вы должны соблюдать баланс между удержаниями и выпусками.

В качестве дополнения, и это то, чего я действительно не знаю: правильно ли использовать malloc_size?

1 голос
/ 13 февраля 2012

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

...