cocoa-touch - 间接使用 NSManagedObject 时发送到已释放实例的消息

标签 cocoa-touch ios memory nsmanagedobject

我有一段让我头疼的代码:

/删除了原始代码,请参阅下面的当前版本/

我收到的消息:

*** -[__NSDate class]: 发送到释放实例 0x69fa350 的消息

编辑 3:

为了测试它,我将所有内容都移到了一个方法中,并验证它仍然会产生相同的错误。 这是一个 splitView iPad 应用程序。 voiceMemo 对象在选择时由左侧的 TableView Controller 传递。右侧 View 有自己的 tableView,这是我加载提醒的地方。

发生了什么,是这样的: 最初,一切都正确加载。在我的数据库中没有任何 reminder 数据的情况下,我可以选择任何条目,它会正确加载。我可以删除它们,修改它们,等等。 我可以选择一个带有 reminder 数据的条目,它会正确加载。详细 View 中的 TableView 已正确填充数据。但是,尝试修改 reminder 时,程序崩溃:消息已发送到已释放的实例。 在不尝试修改任何数据的情况下,如果我尝试使用 reminder 数据加载另一个条目,程序就会崩溃。 我可以从(左侧)主 TableView 中删除没有 reminder 的条目,但是当尝试删除一个 with reminder 数据时,它崩溃(在 save 方法上)。不过,下次我启动该程序时,该条目将被删除。

数据库和自定义类与 iPhone 版本共享,可以正常工作。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    /* only relevant parts posted */

    // Left-side label (title)

    NSSortDescriptor *sortDescriptor = [[[NSSortDescriptor alloc]     
        initWithKey:@"DBreminderDate" ascending:YES] autorelease];
    NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
    NSMutableArray *sortedReminders = [NSMutableArray arrayWithArray:
        [voiceMemo.reminders allObjects]];

    [sortedReminders sortUsingDescriptors:sortDescriptors];
    self.remindersArray = sortedReminders;    

    AKReminder *reminder = [remindersArray objectAtIndex:indexPath.row];

    cell.textLabel.text = reminder.DBreminderTitle;

    if ([cell.textLabel.text length] == 0) {
        cell.textLabel.text = @"Reminder";
    }

    // Right-side label (date)

    NSDateFormatter *format = [[NSDateFormatter alloc] init];
    NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
    [format setLocale:locale];
    [locale release];
    NSDate *reminderSetTo = reminder.DBreminderDate;
    cell.detailTextLabel.text = [NSString stringWithFormat:@"%@", [format     
        stringFromDate:reminderSetTo]]; // breaks here

    return cell;
}

我的数据模型:

Core Data data model

最佳答案

这个声明:

    NSArray *sortDescriptors = [[NSArray alloc] 
    initWithObjects:&sortDescriptor count:1];

我觉得很奇怪。 你是说:

NSArray *sortDescriptors = [[NSArray alloc] 
    initWithObjects:sortDescriptor count:1];

?

添加到 NSArray 的任何对象都应该派生自 NSObject; &sortDescriptor 没有(是指向 sortDescriptor 的指针在内存中的地址)。 这可能会导致在解除分配 sortDescriptors 时不正确地尝试解除分配 &sortDescriptor 而不是 sortDescriptor...

关于cocoa-touch - 间接使用 NSManagedObject 时发送到已释放实例的消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6020163/

相关文章:

c - 如果我们给 a=123 变量 a 的第一个字节赋值 123 但如果我们给 a=1234 那么其他值来了

ios - UIViewController 中的根 UIView 无法调整大小

iOS - 带有来自 php 的值的进度条

ios - 用户通过 iOS6 "tweet sheet"发推后触发一个 Action

ios - 如何以编程方式获取 iOS 状态栏高度

c - 反汇编 C 代码并检查堆栈

iphone - 如何在 UITableViewCell 中模糊(ios7 风格)图像的一部分?

ios - 将 mysql 查询转移到 NSPredicate

objective-c - 移动特定对象后获取贝塞尔曲线的点

function - 为什么某些流行语言中的函数只返回一种类型的结果?