3

アプリをARCに切り替えました。Xcode が提供するリファクタリング ツールのおかげで、移行は部分的に成功しました。動作しない部分は奇妙なエラーです。

メソッドの入れ替え (method_exchangeImplementations) を使用して、UIView の initWithFrame を呼び出す代わりに、myInitWithFrame コードを呼び出すようにしました。リファクタリング プロセスで myInitWithFrame のメソッド宣言でエラーが発生したため、メソッドの宣言の後に__属性__ ((objc_method_family(init))) を追加しました。現在、これはすべて iOS 6.0 以降では完全に正常に機能しますが、iOS 5.0 (サポートしたい最も低い iOS) では機能しません。EXC_BAD_ACCESS (コード = 1、アドレス = 0X28) を取得しています。実行するたびに、まったく同じメモリアドレスが表示されます。

私はそれを呼び出すUIWebViewを持っています:

[[UIWebView alloc] initWithFrame:webViewFrame];

myInitWithFrame が初期化を行った後、self を返し、クラッシュします。スレッド トレースでは、以下に示すように、[UIWebView 保持] メソッドのリンゴのコード (メソッドはグレー表示) でクラッシュすることが示されています。

Thread 1, Queue : com.apple.main-thread
#0  0x3515a7d2 in -[UIWebView retain] ()
#1  0x316ddef4 in objc_retain ()
#2  0x0011528c in -[UIView(style) myInitWithFrame:]

画像を投稿するのに十分な担当者がいません。

同じコードが iOS 6.0 では機能するのに、iOS 5.0 では機能しない理由はありますか?

4

1 に答える 1

5

この問題の修正は非常に複雑でした。この問題が iOS 5 でのみ発生し、iOS 6 では発生しなかったという事実は、これが Apple の問題か、メソッドのスウィズリングの問題である可能性があることを私が最初に示したものでした。約 1 週間検索した後、Apple テクニカル サポートに電子メールを送信して、この問題を解決できるかどうかを確認する必要があるというコンセンサスに達しました。

彼らの反応は、それは私たちの両方のせいだというものでした. 彼は、iOS 5 では UIWebView が (UIWebViewInternal クラスを使用して) 独自の保持カウントを追跡し、完全に初期化される前にメソッドのスウィズリングがオブジェクトを保持していたため、クラッシュが発生したと述べました。私がARCを使用しなかったときは、init関数でretainを呼び出すことは決してなかったので問題ではありませんでしたが、ARCを使用すると、適合を「見た」ときに保持が追加されます。彼は、iOS 6 では UIWebViews が独自の保持カウントを管理しないため、iOS 6 で機能したと述べました。

于 2013-07-17T21:53:15.660 に答える