Core Data 在看似正常的 NSString 字段上崩溃

Posted

技术标签:

【中文标题】Core Data 在看似正常的 NSString 字段上崩溃【英文标题】:Core Data crash on a seemingly normal NSString field 【发布时间】:2010-12-22 16:18:40 【问题描述】:

我还有一个奇怪的错误,我无法弄清楚。

我尝试使用以下代码创建一个 tableviewcell:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

    static NSString *CellIdentifier = @"Cell";

    TableViewCellController *cell = (TableViewCellController *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) 
        [[NSBundle mainBundle] loadNibNamed:@"TableViewCell" owner:self options:nil];
        cell = [_cell autorelease];
        _cell = nil;
     

    // Configure the cell... 

 int storyIndex = [indexPath indexAtPosition: [indexPath length] - 1];
 Article *article = (Article *)[articles objectAtIndex: storyIndex];
 cell.titleLabel.text = article.title;
 cell.siteLabel.text = article.site.name;

 cell.summaryLabel.text = article.description;

 [article release];

    return cell;

问题是我可以用任何值填充标签,除了描述值。一旦我这样做,我就会遇到以下崩溃:

2010-12-22 16:07:13.165 iDoms[24086:207] CoreData:注释:从数据库中完成的故障:0x8b16dd0 程序接收信号:“EXC_BAD_ACCESS”。 警告:无法恢复先前选择的帧。 数据格式化程序暂时不可用,将在“继续”后重试。 (此时调用 dlopen 不安全。)

堆栈中有 62820 个订单项。 我不知道从哪里开始解决这个问题。我已经习惯了 Java,到目前为止,Objective-C 一直是一个关于奇怪的小错误的噩梦。

Article 类如下所示:

//  Article.h

#import <CoreData/CoreData.h>

@class Site;

@interface Article :  NSManagedObject  




@property (nonatomic, retain) NSNumber * id;
@property (nonatomic, retain) NSString * title;
@property (nonatomic, retain) NSNumber * read;
@property (nonatomic, retain) NSString * link;
@property (nonatomic, retain) NSDate * pubDate;
@property (nonatomic, retain) NSString * description;
@property (nonatomic, retain) NSDate * lastUpdate;
@property (nonatomic, retain) Site * site;


@end

//  Article.m

#import "Article.h"

@implementation Article 

@dynamic id;
@dynamic title;
@dynamic read;
@dynamic link;
@dynamic pubDate;
@dynamic description;
@dynamic lastUpdate;
@dynamic site;

@end

数据库包含数据,特定字段只是字符串“Test1”。 任何帮助都非常感谢!

【问题讨论】:

【参考方案1】:

堆栈跟踪的大小让我相信你在某个地方有一个无限递归循环。

我会看看正在创建的自定义 UITableViewCell 的构造,即 summaryLabel 控件以及它是如何连接到单元格的。

我还要确保文章数组是保留的属性。

【讨论】:

我认为问题在于“描述”也是 NSString 的一个属性,我改变了它,现在它似乎可以工作了。一些内存分配似乎仍然存在一些问题,但我会尝试解决这个问题。我会检查“文章”的保留情况。 BP 具有出色的洞察力。 [文章发布] 可能将该托管实体上的保留计数设置为 0,这可能会导致它被释放,从而减少每个属性的保留计数,这可能导致它们被错误释放,这可能会触发各种方式的奇怪的(非 Java 类)行为。【参考方案2】:

我不知道这是否与您当前的问题有关,但您不想做[文章发布];在您的 cellForRowAtIndexPath 方法中,因为 objectAtIndex 没有给您需要释放的参考。

【讨论】:

谢谢,我对我的发布声明做了一些改动,希望这将使整个代码更加稳定。我是 Objective-C 的新手,来自 Java,我以前从未真正遇到过发布问题。 在 Objective-C 中学习内存管理可能很棘手,我花了很长时间才将其归结为第二天性。起初,我只是学会了开始注释对 release 的调用以使代码正常工作,然后又回去尝试通过在必要时通过 release 来追查泄漏。 如果您还没有看过有关内存管理的 Apple 开发人员文档,那么值得一看:developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/…

以上是关于Core Data 在看似正常的 NSString 字段上崩溃的主要内容,如果未能解决你的问题,请参考以下文章

Core Data 中看似有效的对象出现“悬空引用无效对象”错误

将 NSNumber* 的 NSArray 存储为 Core Data 中的 NSString

ios 如何正确使用 NSPredicate 来匹配 Core Data 的 NSString?

iOS Core Data - 意外的内存泄漏

Core Data 中的电话号码存储

Core-Data NSFetchedResultsController 对多关系