0

ボタンが押されるたびにメソッドが呼び出されるという奇妙な問題があります。

- (void)launcherView:(TTLauncherView*)lnchr didSelectItem:(TTLauncherItem*)itm {
  MyObject* obj = ...

  MyViewController* detailView = [[MyViewController alloc] init];  // line A
  [self.navigationController pushViewController:detailView animated:YES];
  [detailView setObject:obj];
  detailView = nil;  // should I also release it? -- line B
}

問題は、detailViewをリリースする必要があることをお詫びします(メモリツールは、メモリリークが発生していないことを示します)。これは、navigationControllerがdetailViewを保持する必要があるためですが、「A」行に自動リリースを追加しようとすると、行"B"、または単に行 "B"のdetailViewのリリース(もちろんnilを割り当てる前)では、プログラムがEXC_BAD_ACCESSでクラッシュし、リリースメッセージが割り当て解除されたインスタンス[CALayer]に送信されます。

何か案が?どうもありがとう

4

4 に答える 4

2

この方法で試してください

- (void)launcherView:(TTLauncherView*)lnchr didSelectItem:(TTLauncherItem*)itm {
  MyObject* obj = ...

  MyViewController* detailView = [[MyViewController alloc] init]; 
  [detailView setObject:obj];
  [self.navigationController pushViewController:detailView animated:YES];
  [detailView release];
  detailView = nil;  // now this will be optional
}
于 2011-03-24T11:15:46.733 に答える
1

これはクラッシュせずに機能しますか?

- (void)launcherView:(TTLauncherView*)lnchr didSelectItem:(TTLauncherItem*)itm {
  MyObject* obj = ...

  MyViewController* detailView = [[MyViewController alloc] init];
  [self.navigationController pushViewController:detailView animated:YES];
  //[detailView setObject:obj];  // <- What's this for?
  [detailView release]
}
于 2011-03-24T11:20:57.747 に答える
0

「initwithnibname」を試してください

無関係ですが、メモリリークを追跡する場合は、 MyObjectをリリースすることを忘れないでください

于 2011-03-24T11:28:34.510 に答える
-1

detailView = nil;解放せずに設定すると、メモリへのポインタはゼロになります。メモリのブロックは、解放するまで割り当てられたままです。

[detailView release]前に使用する必要がありますdetailView = nil。そうしないと、そのメモリブロックを再度参照する方法がなくなります(メモリリーク)。

于 2011-03-24T12:34:27.570 に答える