これは私の問題の更新です。プログラムが中止されると、この警告が表示されます。 警告: フレーム内にないブロックで USE_BLOCK_IN_FRAME 変数を作成しようとしています。
これが何を意味するのかについては、あまり情報が見つかりません。
これは私を困惑させました。EXC_BAD_ACCESS エラーが発生します。私は NSZombieEneabled を持っています (以前の問題を解決しました) が、トレースするコール スタックがありません。
別のフェッチされた結果コントローラーに関して機能しているほぼ同一のコードがいくつかあります。
これは、ジョブ エンティティとそれに関連付けられたクライアント エンティティとの関係と関係があるようです。関係は [ジョブ エンティティ] <<--> [クライアント エンティティ] です。
最初に、選択した行に対応するジョブ エンティティに関係を介してリンクされたクライアント エンティティがない場合、コードはエラーなしで動作することがわかります。したがって、失敗した場合、これはクライアント エンティティを指しますが、失敗していない場合、ポインターは 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 に切り替える前は問題なく機能していました。