7

現在の iOS 5 アプリで iOS 6 をテストしているときに、ちょっとしたバグが発生しました。

ブロックを内部的に使用するが、プロパティとしては使用しない無害なメソッドのメソッド戻り値でロックアップが発生しました。問題は、メソッドの呼び出しが機能し、メソッド内のすべてのコード行 (コードを使用するブロックを含む) も機能することです。

ブロックを呼び出す前に【ブロックコピー】を使ってみたのですが、全く変化がありませんでした。

4

1 に答える 1

21

私のコードの関数定義が内部インターフェイスで宣言されていて、戻り値の型がなかったことがわかりました。

この問題を説明するための図を次に示します。

初期エラー

初期エラー

スタック トラック

スタック トレース

問題のメソッド (問題の正確な場所を特定するために自己から分離)

問題の方法

関数の実装 (これが呼び出されて返されるものです)

実装ライン

プライベート インターフェイスでの定義

プライベート インターフェイスでの定義

関数呼び出しを調べることにしましたが、void ではなく (id) が返されていることに気付きました

(id) を返す関数

最後に、このバグを軽減した唯一のコード変更です。

コードの変更

説明

このバグは、私のクライアントが私たちのアプリが ios 6 で動作しないと言って私に電話したときに醜い頭をもたげました

これをテストするために、iOS 6 と Xcode 4.5 をダウンロードする必要がありました。

アプリを実行するたびに、実際にクラッシュしました。

Google がリンクしている他のサイトでスタック オーバーフローに関するこのバグを探した後、他のサイトで発生しているブロックの問題を試しました。そして、保持されたオブジェクトがスタックから落ちる問題を軽減するために、できる限りコピーを行いました。

ブロック プロパティを使用していなかったので、ブロック自体でコピーを呼び出しました。

これは役に立ちませんでした。

最後に、別の開発者が私と一緒にそれを検討しています。私は一歩下がって別の角度からそれを見ていたので、何が保持されているのかを判断しようと決めました.

関数の結果が保持されていることがわかりました。そして、私がそれを理解する唯一の方法は、オートコンプリートが戻り値の型として私に示した値を見ることでした.

戻り値の型が void であることはわかっていましたが、戻り値の型が id であることがわかり、それがメソッド定義の調査に火をつけました。

私はこの問題を抱えている他の人に役立つことを願っています。私は約 2 時間かけてこの問題を突き止めましたが、存在してはならない結果タイプ間のセマンティックな問題であることが判明しました。

于 2012-09-14T04:13:03.373 に答える