1

私はいくつかの助けが必要なブロックとARCの理解にギャップがあります。私は、アニメーション完了ブロックから発生したテスターからクラッシュレポートを受け取りました。次のようにクラッシュがある:ARCでブロック内で宣言されたオブジェクトの有効期間はどのくらいですか?

例外の種類:EXC_BAD_ACCESS(SIGSEGV)

例外コード:KERN_INVALID_ADDRESS 0xf0000010

でこれは、次のアニメーション終了ブロック内で起きている(animateWithDuration:animations:completion:を使用して)。私は一時的な変数を使用して、2つのビューコントローラを交換しています:

{ 
    [current wasMovedOffScreen]; 
    PlayerViewController *temp = current; 
    current = next; 
    next = temp; 
} 

next = temp;は、クラッシュが発生した行です。アニメーションの時間は0.3秒です。

このコードは、ナビゲーションコントローラなどのオブジェクトのリストを通過するユーザーをシミュレートするために使用される2つの他のビューコントローラのコンテナとして機能するビューコントローラ内で実行されますが、コントローラは私にとっては適切ではありませんでした。

2つの子ビューコントローラは、現在のコントローラが現在のコンテンツを表示し、次のコントローラがリストを移動したときに新しいアイテムでアニメーション化するために使用される。

tempが(currentnextと一緒に)実装で宣言されるようにブロックを変更すると、クラッシュが停止します。しかし、定義上ローカルで一時的な何かのためにクラスivarを保持する必要はありません。 tempどうやらこのプロセス中にARCによって解放されたのはなぜそう

  • これを実装する正しい方法は何ですか?ブロックインプリメンテーションに追加するべき生涯修飾子はありますか?
  • 自分のデバイスまたはシミュレータでクラッシュを再現できないのはなぜですか?どちらのデバイスもiPhone 4と同じバージョンのiOS(5.0.1)を実行していました。

答えて

0

2つのビューを交互に切り替えるだけなので、実際にこの現在の/次のビジネスをすべて必要とするわけではありません。さて、あなたが望むなら、あなたは現在の動きを追跡することができます...しかし、ここに考えがあります。

は、プロパティを持っている場合:

@property (nonatomic, strong) UIViewController *controller1; 
@property (nonatomic, strong) UIViewController *controller2; 
@property (nonatomic, weak) UIViewController *currentController; 

が次にあなたがメソッド持つことができます - あなたがいなかった場合は、元の問題については

- (id)swapControllers { 
    // use the current controller to figure out what the next controller is, so 
    // you don't have to do the two way swap. do in the completion, if you like.  
    UIViewController *nextController = ([self.currentController isEqual:self.controller1]) ? self.controller1 : self.controller2; 
    [UIView animateWithDuration:.25 
        animations:^{ 
         // TODO: some animations on currentController and nextController 
        } completion:^(BOOL finished) { 
         [self.currentController wasMovedOffScreen]; 
         self.currentController = nextController; 
        }]; 
} 

を、ARCはかなりよく、ブロックを処理する方法を知っていますそれを使用して、他の場所で宣言されたブロックをコピーして保存してから、完了ハンドラとして渡すことを忘れてしまったかどうかを尋ねるかもしれません。それは事実ではないので、あなたは再編集を手に入れることができなかったので...私はあなたがベータ版を実行しているかもしれないと推測しています - 遅れてベータ版にいくつかのARCバグがありました。そうであれば、最後の安定したリリースでビルドを試し、より良い結果が得られるかどうかを確認してください。

+0

ベータが関与していないため、レプロの不足は本当に迷惑です! – jrturton

1

私はこの問題が実際にはこのインスタンスでは問題ではないと思います。変数(ローカル変数を含む)はデフォルトで__strongです。したがって、最初の割り当てでcurrentを保持する必要があります。

http://developer.apple.com/library/mac/#releasenotes/ObjectiveC/RN-TransitioningToARC/_index.html - を参照してください「変数修飾子」あなたはあなた自身を再現することはできませんクラッシュを持っていれば、常に固定することが困難になるだろう

。あなたはデバッガの外でアプリを実行しようとしましたか?デバッガをロードすると、動作が変更されることがあります。また、NSZombieEnabled、またはInstruments.appのゾンビツールでデバッグを試してみてください。

関連する問題