Objective-C ブロックの実装では、 superでのメソッドの呼び出しはサポートされていますか?
superでメソッドを呼び出していたときにEXC_BAD_ACCESSエラーがスローされましたが、これらの呼び出しを to から[super methodToCall]
toに変更[self methodToCall]
し、メッセージをレスポンダー チェーンの上に移動させるとすぐに、問題なく動作しました。
ブロックが存在するクラスのインスタンスには の実装はありませんが-methodToCall
、スーパークラス (つまり、自己の継承元のクラス) には実装があります。
ブロックの実装内でスーパーでメソッドを呼び出すことがそもそも(技術的に)問題だった理由の詳細を知りたいので、将来それを避けることができます。変数がブロックでどのようにキャプチャされるか、およびスタックとヒープに関する何かに関連しているのではないかと疑っていますが、具体的な考えはありません。
注: ブロックの実装コードは、ブロックがプロパティに格納されてから数秒後に呼び出されます。プロパティはコピーを使用するため、ブロックのライフサイクルの問題ではないと思います。すべて問題ないようです。また、これは iPhone デバイス (3G) でのみクラッシュしていましたが、iPhone シミュレーターではクラッシュすることなく機能していました。
結果EXC_BAD_ACCESS
:
[self retrieveItemsForId:idString completionHandler:^(NSError *error) {
if (!error) {
[super didRetrieveItems];
} else {
[super errorRetrievingItems];
}
}];
完璧に動作し、スーパークラスに実装-didRetrieveItems
されています。-errorRetrievingItems
[self retrieveItemsForId:idString completionHandler:^(NSError *error) {
if (!error) {
[self didRetrieveItems];
} else {
[self errorRetrievingItems];
}
}];