有时无法访问从 fetchResultController 返回的 NSmanagedObject

Posted

技术标签:

【中文标题】有时无法访问从 fetchResultController 返回的 NSmanagedObject【英文标题】:some time can't access NSmanagedObject returned form fetchResultController 【发布时间】:2011-05-01 16:13:02 【问题描述】:

由于一些奇怪的过度发布,我已经挣扎了好几天。 我的 tableView 类型有点不同,所以不能使用NSFetchControllerDelegate。 实际上每行三个缩略图视图可以触摸。 所以不能用didSelectRowAtIndexPath

问题是在执行补丁之后。对NSManagedObject的第一次访问返回自 fetchedResultController objectAt indexPath 工作......但第二次尝试访问已释放的对象,这意味着对象已经被过度释放。

但更让我抓狂的是TableViewCellForRowAtIndexPath 中完全相同的功能始终有效。

#pragma mark AlbumListViewCellSelectionDelegate  ==> my custom delegate method**** 

- (void)albumContentsTableViewCell:(AlbumLibViewCell *)cell
    selectedPhotoAtIndexType:(NSUInteger)index 
//[self fetch];

NSLog(@"select !!!! %i",index);

lastSelectedRow=cell.rowNumber;


//[selectedAssets addObject:[assets objectAtIndex:(lastSelectedRow * imageNoPerRow) + index]];
int selectId =(lastSelectedRow * imageNoPerRow) + index;

if(albumCount >=(selectId+1))


AlbumTag * album = (AlbumTag *)[fetchedResultsController objectAtIndexPath:[NSIndexPath indexPathForRow:selectId inSection:0]] ;
//scrollView 
    AutoScrollViewController *detailViewController =[[AutoScrollViewController alloc] init];
    detailViewController.hidesBottomBarWhenPushed=YES;


    detailViewController.selectedMoments = [album.moments allObjects];==> first work but overrelease every second try 
    detailViewController.initPhotoNumber = 0;

    // Pass the selected object to the new view controller.
    [self.navigationController pushViewController:detailViewController animated:YES];
    [detailViewController release];


同样的功能,但每次都没有问题

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


NSString *CellIdentifier = @"AlbumLibViewCell";

AlbumLibViewCell *cell = (AlbumLibViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];


if (cell == nil) 
    [[NSBundle mainBundle] loadNibNamed:@"AlbumLibViewCell" owner:self options:nil];
    cell = tmpCell;
    tmpCell = nil;


cell.backgroundColor =[UIColor  blackColor];
cell.rowNumber = indexPath.row;
cell.selectionDelegate = self;

// Configure the cell...
NSUInteger firstPhotoInCell = indexPath.row * imageNoPerRow;
NSUInteger lastPhotoInCell  = firstPhotoInCell + imageNoPerRow;

if (albumCount <= firstPhotoInCell) 
    NSLog(@"We are out of range, asking to start with photo %d but we only have %d", firstPhotoInCell, albumCount);
    return nil;


NSUInteger currentPhotoIndex = 0;
NSUInteger lastPhotoIndex = MIN(lastPhotoInCell, albumCount);
for (firstPhotoInCell ; firstPhotoInCell + currentPhotoIndex < lastPhotoIndex ; currentPhotoIndex++) 

    AlbumTag *albumCell = (AlbumTag *)[fetchedResultsController objectAtIndexPath:[NSIndexPath indexPathForRow:firstPhotoInCell + currentPhotoIndex inSection:0]];
    UIImage *thumbnail = albumCell.rpeMomentThumbnail;

    NSArray *moments =  [albumCell.moments allObjects]; ===> every time works fine

对这种情况的任何想法都可能会有所帮助 提前感谢大家。

【问题讨论】:

代码中的哪一行产生了错误? 您得到的确切错误是什么? 【参考方案1】:

似乎传递给 detailViewController 的对象正在被释放但没有被保留。你应该打开 NSZombies 来调试它。如果这不起作用,您可以使用 Instruments 中的 ObjectAlloc 工具跟踪分配历史记录。

【讨论】:

以上是关于有时无法访问从 fetchResultController 返回的 NSmanagedObject的主要内容,如果未能解决你的问题,请参考以下文章

在从作业中创建 pos 时,由于并发更新而无法序列化访问

有时无法访问配对手表模拟器上的 WatchConnectivity 会话

打开我的电脑或其他文件有时会出现WINDOWS无法访问设备和路径,并说我无权访问,W7的系统。

无法批量加载,因为无法打开文件“ File.csv”。操作系统错误代码5(访问被拒绝。)

如何从c#获取网站标题

找出从后台线程访问的 winforms 控件