使用ARC Over Release的NSDate内存管理

时间:2013-09-20 19:34:09

标签: ios memory-management automatic-ref-counting nsdate ios7

我正在构建一个应用程序,其中使用标准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,因此我无法明确尝试保留此对象。任何帮助将不胜感激。

2 个答案:

答案 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。你在使用过桥演员吗?