我正在构建一个应用程序,其中使用标准View Controller中的UIDatePicker设置NSDate对象。日期被添加到另一个类中的可变字典中。当同一个类试图访问日期对象时,它已经全部准备好被释放,导致崩溃。 此外,自从使用Xcode 5进行编译以来,这只是一个问题。
示例代码
@interface SomeViewController ()
@property (nonatomic, strong) UIDatePicker *datePicker;
@property (nonatomic, strong) ChangeTracker *changeTracker; // Records local changes made to managed objects to send to server
@end
@implementation SomeViewController
// Relevant implementation
- (void)touchSetPicker:(UIButton *)sender
{
[self setDate:self.datePicker.date forManagedObject:self.someManagedObject];
}
- (void)setDate:(NSDate *)date forManagedObject:(NSManagedObject *)managedObject
{
// Set properties on managed object based on date param
// Pass date to changeTracker class
[self.changeTracker setDate:date forManagedObject:managedObject];
}
@end
ChangeTracker.m
@interface ChangeTracker ()
@property (nonatomic, strong) NSMutableDictionary *dateChanges;
@end
@implementation ChangeTracker
- (void)setDate:(NSDate *)date forManagedObject:(NSManagedObject *)managedObject
{
NSString *idProperty = managedObject.idProperty;
self.dateChanges[idProperty] = date;
}
- (void)compileAllChanges
{
for (NSString *idProperty in [self.dateChanges allKeys]) {
// Here is where the crash occurs due to the date being deallocated
NSDate *date = self.dateChanges[idProperty];
}
}
@end
启用僵尸对象后,我收到错误消息: - [__ NSDate release]:发送到解除分配的实例的消息
该项目正在使用ARC,因此我无法明确尝试保留此对象。任何帮助将不胜感激。
答案 0 :(得分:1)
我遇到了@ gabriel-ortega描述的同样问题 我想知道他是否找到了解决原因的方法。
编辑:为了回答自己并希望帮助其他人,我找到了问题的原因。
正如Apple文档所说:
为了允许与手动保留释放代码进行互操作,ARC对方法命名施加了约束:您不能为访问者提供以new开头的名称。这反过来意味着你不能,例如,声明一个名称以new开头的属性,除非你指定一个不同的getter:
// Won't work: property NSString *newTitle; // Works: property (getter=theNewTitle) NSString *newTitle;
我的媒体资源名称为newPath
,因此可以解释......
答案 1 :(得分:0)
如果你使用ARC,你不应该得到僵尸。你有一个变量声明为unsafe_unretained而不是weak吗?或者您在某处使用第三方库?内部使用手动引用计数代码的库可能是僵尸的来源。
不正确使用unsafe_unretained会导致您引用已释放的对象,但是使用正常的强引用和弱引用,弱引用会在释放后立即归零,因此您不应该在它们发送后立即向它们发送消息已被释放。
另一种可能性是误用桥接演员。这可能会搞砸ARC。你在使用过桥演员吗?