私たちのアプリは iOS14 では正常に動作しますが、iOS15 ではクラッシュします
ModalVC の contentViewController の次のレスポンダーは ModalVC です。モーダルの割り当て解除は、iOS14 と 15 の両方で contentVC の前に発生します。つまり、contentVC の nextResponder が contentVC の前に割り当て解除されます。
2021-09-02 09:26:56.008505-0700 AppDevelopment[75463:1003950] ----------- ModalVC dealloc
2021-09-02 09:29:02.799891-0700 AppDevelopment[75463:1003950] ----------- NewPhotoAssetVC dealloc
私たちの再現ケースでは、NewPhotoAssetViewController はモーダルの contentVC です。NewPhotoAssetViewController の dealloc メソッドで、iOS14 で nextResponder を要求すると、次のようになります。
(lldb) po [self nextResponder]
nil
ただし、iOS15 では、同じ場所で次のレスポンダーを要求すると、次のようになります。
(lldb) po [self nextResponder]
2021-09-02 09:27:10.952742-0700 AppDevelopment[75463:1003950] *** -[ModalViewController retain]: message sent to deallocated instance 0x7fae0d6815b0
error: Execution was interrupted, reason: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0).
式の評価前の状態に戻りました。何らかの理由で contentVC の nextResponder が iOS15 で nil に設定されていないようです。その後、他のオブジェクトに変更された可能性のあるこのガベージ ポインターにメッセージを送信すると、クラッシュが発生します。
nextResponder は読み取り専用であるため、明示的に nil に設定することはできません。これが Apple のバグなのかわからないのですが、これを回避する方法はありますか?