2

ストーリーボードからジェスチャーレコグナイザーを引き出しましたが、正常に機能しています...

低メモリ警告をシミュレートする場合を除きます。その時点で、次のエラーでクラッシュします。

[UISwipeGestureRecognizer retain]: message sent to deallocated instance 0x8627330

クラッシュしないようにするには、ジェスチャレコグナイザーを強力なプロパティとして設定し、viewdidloadで自動生成されたセットをnilにコメントアウトする必要があります。

//[self setSwipeGestureRecognizer:nil];

私はランダムにこの解決策にたどり着きました、そして誰かがここで何が起こっているのか説明できることを望んでいますか?

4

1 に答える 1

5

魅力的な。あなたが最初にこれを投稿したとき、私はあなたのコードに何らかの問題があると思っていましたが、あなたの明確なコメントを考慮して、私はそれを自分で試してみることにしました。私はあなたと同じ行動を経験します。

具体的には、Interface Builderでジェスチャレコグナイザーを作成し、それを適切なものにリンクして、IBAction別のViewControllerにプッシュしてポップしても正常に機能することを確認しました。しかし、そのセカンダリView Controllerで、元のView Controllerに戻った直後にメモリ警告をシミュレートすると、同じクラッシュが発生します。

簡単に修正できます。アプローチがあるようです。または、Interface Builderを完全にバイパスして、コードで独自のジェスチャレコグナイザーを作成することもできます。この問題は発生しません。たとえば、

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Do any additional setup after loading the view.

    UIPanGestureRecognizer *recognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)];
    [self.view addGestureRecognizer:recognizer];
    // [recognizer release]; // uncomment in non-ARC project
}

このように手動で作成した場合、メモリ警告をシミュレートした後、ビューに戻ったときにクラッシュすることはありません。それがあなたの解決策です。

幸い、これはXcodeとiOSの次のバージョンのベータ版で修正されたようです。

于 2012-07-01T18:27:30.973 に答える