0

そのため、メモリ管理の問題を探すために時間を費やすことについて多くの検討と少しのフラストレーションを感じた後、私はいくつかの調査を行い、最終的にARCへの変更に屈しました。そして、それは比較的痛みがありませんでした。しかし、UIViewControllersに関連する新しい問題が表面化しました。プレアークはすべて宣伝どおりに機能し、スタックにプッシュして表示され、deallocメソッドが呼び出されてスタックからポップされ、全員が満足していました。ARCに切り替えると、deallocは呼び出されません。残念です。だから私は問題についていくつかの調査をしました、私がしていることとしていないことをリストアップさせてください

第一に、私がスタックにプッシュしているビューは、明示的に強力であると宣言されていません。

。親クラスの子クラスが持つデリゲートはunsafe_unretainedですが、ベースをカバーするために、デリゲートを親に設定することもコメントアウトしました。喜びはありません。

.NSzombiesをオフにすると、ARC対応のコードに問題が発生する可能性があります。

.iは、iOSビュー階層でリリースされていないメモリ内のbrad larsonsの回答によると、コードを変更しました。

if (_friendsListVC == nil) 
{
    _friendsListVC = [[FriendsListViewController alloc] initWithNibName:nil bundle:nil];
    _friendsListVC.delegate = self;
}

[self.navigationController pushViewController:_friendsListVC animated:YES]; 

(_friendsListVCはメンバー変数です)。これに

 FriendsListViewController *fVC = [[FriendsListViewController alloc] initWithNibName:nil bundle:nil];
 //fVC.delegate = self;
 [self.navigationController pushViewController:fVC animated:YES]; 

再び喜びはありません。deallocブレークポイントがヒットすることはありません。アプリで多くのビューをプッシュしてポップするので、うまくいけば修正するためにARCに切り替えた問題に加えて、メモリの問題が増えるだけです。 ..

また、このビューには他のいくつかのコードブロックと同様にいくつかのコードブロックがありますが、私も読んだ自己を使用していません。自己保持されているため、コードブロックに関してはrefを弱くする必要があります。

私は困惑していますが、ARCが何をしているのか誰かが私を解明できますか?または、ARCの使用を尊重して何をしていないのですか?将来の参照のために、ARCのビュー階層にプッシュするすべてのビューはインスタンス変数ではありませんか?

前もって感謝します。

4

3 に答える 3

3

私は問題が何であるかを理解しました、しかしそれは割り当て解除されていなかった他のコントローラーを修正しませんでした、それらは完全に異なる理由でした。したがって、知識を広め、この痛みを他の人に軽減するために、保持サイクルを引き起こす可能性のあるものの数をリストアップします。主にARCとUIViewControllersおよびコードブロックに関連します。

  1. あなたが推し進めている見解への強い言及を持ってはいけません。

  2. ビュー階層にプッシュしているクラスに、pushメソッドを呼び出すクラスのデリゲートがあり、それをunsafe_unretained参照にする場合、実際には、すべてのデリゲートをunsafe_unretainedにすることをお勧めします。これは、私のデリゲートの1つが私が想定したように強力だったためです。 ARCコンバーターは私のためにそれを行います。

  3. NSZombiesをオフにします。永続的に気にしないでください。deallocステートメントが必要なときに呼び出されていることを確認する必要がある場合に限ります。

  4. コードブロックで自分自身を直接参照しないでください。これにより、保持サイクルが発生します。自分自身を使用する必要がある場合は、ブロックの外で次のことを行います(次にweakselfを使用します)

    __unretained_unsafe className * weakSelf = self;

  5. 静的参照に注意してください。これについてはよくわかりませんが、インスタンス化された2つのView Controllerを取り込んで、一方を他方の上にプッシュするメソッドがありました。参照は、このクラス内の2つの静的インスタンスに割り当てられました(質問しないでください)。なぜ)、それらが使用された後にそれらをゼロにした後、それは私の問題を解決したようでした、私は理由がわかりません。

  6. これは私にはわかりませんが、どこかで1、2回言及されているのを見ました。クラスにコードブロックがある場合は、そのブロック内でインスタンス変数を使用しないようにして、変数を__unsafe_unretainedにします。

そして、これで終わりです。これらのほとんどをチェックして修正した後、すべてのビューで、奇妙な任意のポイントではなく、毎回プッシュされるときに、deallocメソッドが呼び出されます。また、これは同じ問題に直面している人をすばやく支援するための簡単なチェックリストにすぎないことを明確にするために、ここでいくつかの概念を完全に理解しているとは言いませんが、間に合うことを望んでいるので、そうすることをお勧めします。

于 2012-12-11T08:13:51.550 に答える
0

これがまさにInstrumentsが存在する理由です。Leaksインストゥルメントを実行すると、それらのView Controller(既に知っている)を割り当てるものと、他に保持しているもの(あなたが知らない)がわかります。

また、メモリリークが存在すると主張しますが、ObjectAlloc計測器を実行して、繰り返し使用するとメモリ使用量が実際に増加するのを確認するまではわかりません。

于 2012-12-10T06:33:01.150 に答える
0

同じ問題が発生しました。

プロジェクトのオプションを無効NSZombieにすると、うまくいきました。なぜそれが起こっているのか分かりません。

  • ProductEditスキームに移動します
  • NSZombieを無効にする
于 2012-12-10T06:48:35.090 に答える