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