ARC и не ARC Framework - iOS - правильное освобождение не работает? - PullRequest
0 голосов
/ 08 февраля 2012

Я разрабатываю приложение для iPad с включенной дугой. Но сейчас я использую небольшой фреймворк без дуги. Я установил флаг -fno_objc_arc и так далее. Но остается еще одна проблема: Один объект в рамках содержит ссылку на текущий viewController. Если я оставляю текущий ViewController, платформа освобождает свойство контроллера:

[viewController release];

Объект освобождается, и все кажется нормальным. Но при ближайшем рассмотрении вы поймете, что все переменные экземпляра все еще действительны и существуют Давайте предположим, что мой viewController имеет две переменные экземпляра для переменных экземпляра - массив и subviewController. Обычно в arc переменные экземпляра освобождаются, если основной объект освобождается. Но если не-Arc Framework отправляет сообщение об освобождении, кажется, что объект не освобождает свои переменные экземпляра, вызывая ошибку памяти, потому что на них больше нет ссылок!

EDIT

Вот количество ссылок, таблица - это переменная экземпляра освобождающего ViewController:

контроллер до: 1
Таблица экземпляров контроллера до: 1
теперь [версия viewController] отправляется
контроллер после: 0
таблица экземпляров контроллера после: 1

Есть предложения по этому вопросу? Буду признателен за любую помощь!

1 Ответ

0 голосов
/ 08 февраля 2012

Дорогой друг, использующий ARC, не означает, что в dealloc нет кода выпуска.Компилятор вставляет код выпуска, где это уместно, и, таким образом, он также вставляет код выпуска в переменные вашего экземпляра, который не виден, потому что компилятор вставляет его во время компиляции, когда ваша не-дуговая структура отправляет сообщение о выпуске и если ваш объект освобождается, что я предполагаючто его счетчик сохранения был равен 1, тогда вызывается его dealloc, и в dealloc есть код выпуска для переменных вашего экземпляра, который также освобождается (если экземпляр также имеет 1 счетчик сохранения)



~ ~~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ Отредактировано ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
используйте этот код

NSLog(@"before release : viewController:%d  controllerTable:%d",[viewController retainCount],[controllerTable retainCount]);
[viewController release];
// here just give os to deallocate its memory so I'm just inserting some code which is unnessary but it may give os to reclaim the memory
for (int i=0; i<10; i++) {
    NSLog(@"Just do nothgin here and m also sleeping it to make sure that system get enoght time to reclaim the gabaged memory");
    [NSThread sleepForTimeInterval:0.1];
}
//as it is crashed so commented
//NSLog(@"after release : viewController:%d",[viewController retainCount]);
//it should also crash now
NSLog(@"after release : controllerTable:%d",[controllerTable retainCount]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...