尝试使用NSFetchedResultsController创建USE_BLOCK_IN_FRAME ... EXC_BAD_ACCESS

时间:2011-05-07 17:01:41

标签: core-data exc-bad-access nsfetchedresultscontroller nszombieenabled

这是我的问题的更新。程序中止时我现在收到此警告。 警告:尝试使用不在框架中的块创建USE_BLOCK_IN_FRAME变量。

我找不到很多关于这意味着什么的信息。


这令我感到困惑。我收到EXC_BAD_ACCESS错误。我有NSZombieEneabled(它帮助解决了早期的问题),但是没有要跟踪的调用堆栈。

我有一些几乎相同的代码,它与另一个获取的结果控制器有关。

这似乎与作业实体及其关联的客户实体之间的关系有关。该关系是[工作实体]<< - > [客户实体]。

最初,我看到代码正常工作,其中与所选行对应的作业实体没有通过关系链接的客户端实体。因此,在失败的情况下,这指向客户端实体,但是当它没有失败时,指针为零。

当我遇到此问题时,我启动应用程序并直接进入作业选择器视图并选择一个单元格。就在那时,问题就出现了。

我做了一个实验,首先启动应用程序并转到客户端选择器视图,知道所有客户端实体都会进行提取。然后我去了工作选择器视图并选择了一个单元格。问题没有发生。

由于我只是尝试将指针传递给已经获取的作业实体,因此我不明白发生了什么。

顺便说一句,在我切换到使用NSFetchedResultsControllers之前,代码工作正常。我喜欢他们可以为我做的事情,但这里有一些动态,我还没想到。

日志记录没有向我展示解决问题的任何理解。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    userState.selectedJob = [self.fetchedResultsController objectAtIndexPath:indexPath];
    NSLog(@"\n\n(1 Pick) indexPath: %@\n",indexPath);
    NSLog(@"\n\n(1 Pick) userState: %@\n",userState);    
    NSLog(@"\n\nnumber of Objects in job fetchresultscontroller = %d", [[fetchedResultsController fetchedObjects] count] );    
    NSLog(@"\n\n(1 Pick) selected job: %@\n",[self.fetchedResultsController objectAtIndexPath:indexPath]); // This line is causing the problem...
    NSLog(@"\n\n(1 Pick) selected job: %@\n",userState.selectedJob); // Omitting the line above, this line fails 
    [self.navigationController pushViewController:userState.jobInfoTVC animated:YES];     
}

调试输出

2011-05-07 09:27:04.142 job1[6069:207] 

(1 Pick) indexPath: <NSIndexPath 0x5952590> 2 indexes [0, 3]
2011-05-07 09:27:04.142 job1[6069:207] 

(1 Pick) userState: <UserStateObject: 0x5919970>
2011-05-07 09:27:04.143 job1[6069:207] 

number of Objects in job fetchresultscontroller = 4
(gdb) 

最终的代码应该像这样简单,这导致了我所有的日志记录:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    userState.selectedJob = [self.fetchedResultsController objectAtIndexPath:indexPath]; // Original failure was at this line
    [self.navigationController pushViewController:userState.jobInfoTVC animated:YES];     
}

我使用singleton userState来跟踪用户的操作。所以我保留了最后的selectedJob和selectedClient实体指针。在我切换到NSFetchedResultsController之前,这个工作正常。

2 个答案:

答案 0 :(得分:1)

我还遇到了尝试使用不在框架中的块创建USE_BLOCK_IN_FRAME变量的问题。虽然我和NSFetchedResultsControllers没什么关系。

可能是你的问题

我注意到你提到你正在使用单身人士,所以也许你的问题在这个链接上解决了:

http://npenkov.com/2011/08/01/solving-issues-like-warning-attempting-to-create-use_block_in_frame-variable-with-block-that-isnt-in-the-frame/

从链接:

  

在会话管理器中我使用了宏,在@synthesize之前 - 这就是问题,静态定义不应该出现在合成方法之前。所以如果你有类似的东西:

SYNTHESIZE_SINGLETON_FOR_CLASS(SessionManager)
@synthesize loggedUserId, ...
  

只需将其替换为:

@synthesize loggedUserId, ...
SYNTHESIZE_SINGLETON_FOR_CLASS(SessionManager)

enter code here

我的问题

我遇到的问题是复制变量声明,在这种情况下是从NSManagedObject继承的变量:

- (void)functionThatDoesSomething {

    VariableInheritedFromNSMObj *variableA = nil;

    for (VariableInheritedFromNSMObj *variableA in [self containerObject]) {
         NSLog(@"a = %@\n", [variableA name]);
    }

    [variableA setName:@"StackOverflow"];

}

将第一行(其中variableA初始化为nil)移动到循环后修复问题。在我的生产代码中,我随后更改了其中一个变量的名称。

希望能帮助您或遇到此问题的其他人。这个错误似乎以许多不同的方式表现出来。

答案 1 :(得分:0)

部署目标操作系统版本是否设置为低于Xcode 4.2中的调试支持?当发生这种情况时,部署目标已经以某种方式变为4.1,但我只有4.3模拟器而没有4.0-4.1的额外调试支持。

有办法解决这个问题:

  1. 从Xcode首选项安装较低操作系统版本的调试符号。转到下载,组件并安装OS 4.0 - 4.1设备调试支持(如果需要,可以更早)。
  2. 将部署目标设置为4.3或更高。
  3. 如果您选择前者,则可能需要在首选项框中勾选以自动下载更新。