1

私を悩ませている何かについて必死に助けを求めています...

これはすべてARCの下にあります。

プロファイル画面 (UserProfileVC) があり、その画面のボタンをクリックすると、SettingsVC が表示されます。SettingsVC は UserProfileVC の settingsVC ivar に保持されており、ボタンのクリックに応答するときに、settingsVC が nil かどうかを確認し、ストーリーボードから作成して提示します。

- (IBAction)handleSettingsButtonPressed:(id)sender {
    if (!settingsVC) {
        settingsVC = [self.storyboard instantiateViewControllerWithIdentifier:@"UPSettingsVC"];
        settingsVC.model = self.model;
        settingsVC.horizontalCoverPresentingVC = self;
    }

    [self horizontalCoverTransitionToViewController:settingsVC duration:0.35f];
}

SettingsVC を閉じるときは、スーパービューからビューを削除するだけです (これは基本的に #horizo​​ntalCoverTransitionToViewController:duration: メソッドが行うこととは反対です)。nil に設定したことはありません。

UserProfileVC から SettingsVC に移動して戻ることができます... 正確に 1 回。SettingsVC に戻ろうとすると、

if (!settingsVC) {...}

ブロックし、入力しないでください(settingsVCがまだ存在していることを示しています)。

[self horizontalCoverTransitionToViewController:settingsVC duration:0.35f];

EXC_BAD_ACCESS (code=1...) エラーが発生します。

Zombies をオンにすると、SettingsVC が Zombie になっていることがわかります。

そのクラスのコンパイラ フラグに -fno-objc-arc を追加し、#release を実装してブレークポイントを配置するところまで行っています。

リリースは、SettingsVC を閉じるコードから呼び出されますが、同じ正確なコードがアプリ内の他のほとんどすべての VC で使用されており、それらのいずれもリリースを発生させません。

どこを見るべきか、デバッグする方法、またはインストゥルメントを使用して問題を解決するためのヒントを誰かに教えてもらえますか??

根本的なフレームワークのバグが疑われ始めていますが、問題を実証するために小さなサンプル アプリを作成すると、問題なく動作するため、このクラスに特有のものがあるはずです。

ご意見ありがとうございます。

4

2 に答える 2

2

Zombies をオンにすると、SettingsVC が Zombie になっていることがわかります。

Instruments を使用して、参照カウント操作 (割り当て) を記録します。ゾンビも有効にできます。プログラムが停止したら、オブジェクト リストで VC を見つけ、そのインスタンスの記録された参照カウント操作を確認します。通常、不均衡が発生した場所は非常に明確ですが、予想よりも多くの操作が行われる可能性があります。

于 2013-09-27T21:27:19.970 に答える
0

settingsVC問題は、 ivar をstrongプロパティとして宣言していないことだと思います。Apple のメモリ管理規則によれば、 によって返される View Controller を所有していません- (id)instantiateViewControllerWithIdentifier:(NSString *)identifier。それを所有するには、ivar を強力なプロパティとして宣言する必要があります。これを試してみてください。

@property(nonatomic, strong) SettingsVC *settingsVC;

お役に立てれば!

于 2013-09-27T21:28:09.777 に答える