0

我正在构建一个应用程序,其中使用标准视图控制器中的 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]: message sent to deallocated instance

该项目正在使用 ARC,因此我无法明确尝试保留此对象。任何帮助,将不胜感激。

4

2 回答 2

1

我遇到了@gabriel-ortega 描述的相同问题,我想知道他是否找到了任何解决原因的方法。

编辑:为了回答自己并希望也能帮助别人,我找到了问题的原因。

正如苹果文档所说:

为了允许与手动保留释放代码互操作,ARC 对方法命名施加了约束:您不能为访问器指定以 new 开头的名称。这反过来意味着,例如,除非您指定不同的 getter,否则您不能声明名称以 new 开头的属性:

// Won't work:
property NSString *newTitle;

// Works:
property (getter=theNewTitle) NSString *newTitle;

我的财产名称newPath如此解释......

于 2014-03-14T10:14:02.220 回答
0

如果你使用 ARC,你不应该得到僵尸。你有一个变量声明为 unsafe_unretained 而不是弱?还是您在某处使用第三方库?内部使用手动引用计数代码的库可能是僵尸的来源。

不当使用 unsafe_unretained 可能会导致您引用已释放的对象,但是对于正常的强引用和弱引用,弱引用在释放后立即归零,因此一旦它们被释放,您应该无法向它们发送消息释放。

另一种可能性是滥用桥接演员表。那会搞砸ARC。你在使用桥接演员吗?

于 2013-09-20T20:54:49.173 回答