[CFString release]: message sent to deallocated instance [CFString release]:发送给已释放实例的消息

9

我已经为一个奇怪的问题苦苦挣扎了两天。我查看了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

The Zombies Instruments 指的是我设置单元格文本标签的第二行。
cell.txtLabel.text = _reservationModule.newReservationText;
cell.subtitleTxtLabel.text = _reservationModule.newReservationSubtitle;

_reservationModule是一个Core Data实体,具有字符串属性。它在视图控制器中定义为@property (nonatomic, strong) ReservationModule *reservationModule;

僵尸历史:

Event TypeRefCt 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上发生过。 非常感谢您的帮助! 谢谢!

这对我在ARC方面很有帮助:http://stackoverflow.com/a/10596942/3411787 - Mohammad Zaid Pathan
1个回答

31

答案很简单,与保留计数器没有任何关系...

我疏忽了启用ARC时不允许以new开头命名变量/属性。这显然导致了过度释放,从而生成了错误...

根据苹果文档:https://developer.apple.com/library/ios/releasenotes/objectivec/rn-transitioningtoarc/introduction/introduction.html

为了允许与手动保留-释放代码进行交互,ARC对方法命名施加了一个限制:

您不能给访问器命名以new开头的名称。这反过来意味着除非您指定不同的getter,否则您无法声明以new开头的属性。


属性可以使用,但这不适用于本地变量。 - Chris Hatton
2
仍然可能在Swift代码中发生:(只是使用这个答案以帮助跟踪名为"new_notifications_count"的CoreData属性的问题) - christophercotton
谢谢,老兄!我忘记了这个 ARC 功能。它可以在 iPhone 5s 及以上的设备上工作,但无法在 iPhone 5 上工作。 我的 Core Data 模型中有一个名为 newPoints 的属性。名称更改后,我摆脱了崩溃的问题。你是我的救世主;] - Oleg
在2017年仍然存在问题。非常感谢! - Sahil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接