[Выпуск CFString]: сообщение отправлено в освобожденный экземпляр

Уже два дня бьюсь со странной проблемой. Я рассмотрел все связанные вопросы на SO, но ни один из них не решил проблему. Я работаю над Xcode5. Я использую ARC и CoreData.

На iOS7 (симулятор):

`[CFString release]: message sent to deallocated instance`

Thread 1, Queue : com.apple.main-thread
0   0x03c7d3ba in __kill ()
1   0x03c7c4b8 in kill$UNIX2003 ()
2   0x0347a921 in ___forwarding___ ()
3   0x0347a4ee in _CF_forwarding_prep_0 ()
4   0x02b7b002 in -[NSConcreteAttributedString dealloc] ()
5   0x02f66692 in objc_object::sidetable_release(bool) ()
6   0x02f65e81 in objc_release ()
7   0x02f66ce7 in (anonymous namespace)::AutoreleasePoolPage::pop(void*) ()
8   0x00739bc4 in CA::Transaction::observer_callback(__CFRunLoopObserver*, unsigned long, void*) ()
9   0x0345253e in __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ ()
10  0x0345248f in __CFRunLoopDoObservers ()
11  0x034303b4 in __CFRunLoopRun ()
12  0x0342fb33 in CFRunLoopRunSpecific ()
13  0x0342f94b in CFRunLoopRunInMode ()
14  0x04bd19d7 in GSEventRunModal ()
15  0x04bd17fe in GSEventRun ()
16  0x0196794b in UIApplicationMain ()
17  0x0000262d in main

Инструменты Zombies указывают на вторую строку, где я устанавливаю текстовые метки ячейки:

cell.txtLabel.text = _reservationModule.newReservationText;
cell.subtitleTxtLabel.text = _reservationModule.newReservationSubtitle;

_reservationModule — это объект Core Data со строковыми свойствами. Он определен в контроллере представления как @property (nonatomic, strong) ReservationModule *reservationModule;

История зомби:

Event Type  ∆ RefCt RefCt   Timestamp   Responsible Library Responsible Caller
Malloc/Retain/Release (4)   01:01.114.922   CoreData    _prepareResultsFromResultSet
0  Malloc   +1  1   01:01.114.922   CoreData    _prepareResultsFromResultSet
1  Retain   +1  2   01:01.116.184   CoreData    -[_CDSnapshot mutableCopy]
2  Release  -1  1   01:01.318.588   MyApp       -[ReservationModuleChoice2ViewController configureSubtitleImageTableViewCell:atIndexPath:]
3  Release  -1  0   01:05.004.359   CoreData    -[_CDSnapshot dealloc]
4  Zombie       -1  01:07.441.465   CoreData    -[_CDSnapshot dealloc]

Однако они никогда не встречались в Xcode 4.6.x. Любая помощь высоко ценится!

Спасибо!


person Francesco    schedule 28.09.2013    source источник
comment
Это помогло мне для ARC: stackoverflow.com/a/10596942/3411787   -  person Mohammad Zaid Pathan    schedule 24.02.2016


Ответы (1)


Ответ тривиален и не имеет ничего общего с сохранением счетчиков...

Я следил за тем, чтобы имена переменных/свойств не начинались с new при включенном ARC. Это, очевидно, привело к чрезмерному выпуску, что привело к ошибке...

Из документации Apple: https://developer.apple.com/library/ios/releasenotes/objectivec/rn-transitioningtoarc/introduction/introduction.html

Чтобы разрешить взаимодействие с ручным кодом сохранения и освобождения, ARC накладывает ограничение на наименования методов:

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

person Francesco    schedule 30.09.2013
comment
Свойства да; это не относится к локальным переменным. - person Chris Hatton; 12.05.2015
comment
и все еще может произойти в быстром коде :( Просто использовал этот ответ, чтобы помочь отследить проблему с атрибутом CoreData, называемым new_notifications_count - person christophercotton; 29.10.2015
comment
Спасибо, мужик! Я забыл об этой функции ARC. Это работало на iPhone 5s и более поздних версиях, но не работало на iPhone 5. У меня было свойство в моей модели Core Data под названием newPoints. После смены имени я избавился от вылета. Ты мой спаситель ;] - person Oleg; 17.02.2017
comment
все еще проблема в 2017 году. Большое спасибо! - person Sahil; 27.06.2017