[英]Persisting NSMUtablearray which is property of Core Data Entity
@interface Week : NSManagedObject {
}
@property (nonatomic, retain) NSNumber *weekID;
@property (nonatomic, retain) NSString *top;
@property (nonatomic, retain) NSString *summary1;
@property (nonatomic, retain) NSMutableArray *book;
@end
我正在从服务器读取XML文件并将vales放在上述实体中。由于该周要读取的书籍可能是多个,因此它存储在MutableArray中。我使* book可在我的.xcdatamodel文件中进行转换。
我的解析器看起来像这样,它在Week实体上方进行解析和初始化。
if ([currentTag isEqualToString:@"book"]) {
NSString *USGSWebLink = [currentElementValue1 stringByStandardizingPath] ;
[week.book addObject:USGSWebLink];
[week setBook:week.book];
NSError *error;
if (![self.managedObjectContext save:&error]) {
NSLog(@"%@", [error domain]);
}
这存储得很好,因为我从Coredata获取了上面的值并存储在NSMutableArray“ weekArray” **中,以显示在UITableView中 。
我的程序在以下两个函数中崩溃,崩溃点在以下两个函数之间切换...奇怪!!!
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
**//sometimes program crashes at this point**
return [weekArray count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
NSManagedObject *object = (NSManagedObject *)[weekArray objectAtIndex:indexPath.row];
**// program crash at the above line.**
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
}
cell.textLabel.text = [object valueForKey:@"top"];
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
// Set up the cell
return cell;
}
*请告诉我我在哪里做错了? 我在解析器或NSManagedObject *object = (NSManagedObject *)[weekArray objectAtIndex:indexPath.row];
存储NSMutableArray 书籍的方式是否有问题NSManagedObject *object = (NSManagedObject *)[weekArray objectAtIndex:indexPath.row];
行,因为我的NSLog不打印在indexPath.row行下面。
我的提取函数是 :
- (void)fetchRecords {
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Week" inManagedObjectContext:appDelegate.managedObjectContext];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:entity]; //NSLog(@"fetchRecords = %@",appDelegate.managedObjectContext );
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"weekID" ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
[request setSortDescriptors:sortDescriptors];
[sortDescriptor release];
NSError *error;
NSMutableArray *mutableFetchResults = [[[managedObjectContext executeFetchRequest:request error:&error] mutableCopy] autorelease] ;
if (!mutableFetchResults) {
}
if (mutableFetchResults == nil) {
NSLog(@"week fetch failed");
}
self.weekArray = mutableFetchResults; NSLog(@"weekArray = %@",weekArray);
[mutableFetchResults release];
[request release];
}
看起来这可能是“过度释放的错误”。 在您的提取方法中,您具有:
NSMutableArray *mutableFetchResults =
[[[managedObjectContext executeFetchRequest:request
error:&error] mutableCopy] autorelease] ;
这会使用获取结果的可变副本初始化“ mutableFetchResults”数组。 然后,您指定此数组应自动释放(这意味着它将在可能的情况下释放)。
然后,您可以使用以下方法将“ mutableFetchResults”分配给您的类的属性:
self.weekArray = mutableFetchResults;
正如您已将此属性声明为“保留”一样,当您将“ mutableFetchResults”分配给该属性时,您的类将保留它。 现在,其他人已经通过保留该数组来声明了该数组的所有权,较早的“ autorelease”可以自由发送“ release”消息。 在这一点上,一切都很好,因为您所有的保留和释放都是平衡的。 但是,在下一行,您可以使用以下命令再次明确地释放它:
[mutableFetchResults release];
这是不必要的,因为它已经由“ autorelease”发布了。 这种“过度释放”的结果是,分配给“ self.weekArray”的引用现在可能指向内存中的其他随机对象-这很可能是您尝试访问数组时应用程序崩溃的原因。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.