0

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

[viewController release]; 

Объект будет освобождён и кажется, что все будет в порядке. Но, глядя ближе, вы поймете, что все переменные экземпляра остаются действительными и существующими. Предположим, что мой viewController имеет две переменные экземпляра для переменных экземпляра - массив и subviewController. Обычно в дуге переменные экземпляра освобождаются, если основной объект освобождается. Но если инфраструктура non arc отправляет сообщение о выпуске, кажется, что объект dosen't освобождает свои переменные экземпляра, вызывая ошибку памяти, потому что они не упоминаются нигде!

РЕДАКТИРОВАТЬ:

Здесь счетчик ссылок, таблица является переменной экземпляра высвобождения ViewController:

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

Любые предложения по этой проблеме? Буду признателен за любую помощь!

ответ

0

Дорогой друг, использующий 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]); 
+0

Да, спасибо, именно так оно и должно быть: Обоснование: хотя ARC автоматически уничтожает переменные экземпляра ..... (ARC Doc) Но если вызывается вызов [viewController release] (в недуговой структуре) , переменные экземпляра освобожденного контроллера (который управляется дугой) все еще существует, хотя keepCount равен 1 - до и после отправки релиза – Alexander

+0

вы его проверяли или вы просто принимаете это? –

+0

Как я могу это принять? Я проверил его: po [viewController controllerTable] (gdb) print (int) [0x88be250 saveCount] $ 1 = 1 Теперь [просмотр релиза]; отправляется (gdb) print (int) [0x88be250 saveCount] $ 2 = 1 – Alexander

Смежные вопросы