7

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

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


这让我很困惑。我收到 EXC_BAD_ACCESS 错误。我有 NSZombieEneabled (这有助于解决早期的问题),但没有调用堆栈可跟踪。

我有一些几乎相同的代码可以用于另一个获取的结果控制器。

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

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

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

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

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

顺便说一句,在我改用 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];     
}

我使用单例 userState 来跟踪用户所做的事情。所以我把最后一个 selectedJob 和 selectedClient 实体指针保留在那里。在我切换到 NSFetchedResultsController 之前,这一切正常。

4

2 回答 2

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"];

}

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

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

于 2011-11-24T03:24:58.027 回答
0

部署目标操作系统版本是否设置为低于您在 Xcode 4.2 中提供的调试支持?当这发生在我身上时,部署目标不知何故更改为 4.1,但我只有 4.3 模拟器,没有对 4.0-4.1 的额外调试支持。

有一些方法可以解决这个问题:

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

如果您选择前者,则可能值得在首选项中勾选框以自动下载更新。

于 2011-11-16T16:01:38.793 回答