0

列挙メソッドを呼び出しているコードに取り組んでいました。

- (void)enumerateRangesOfString:(NSString*)string usingBlock:(void (^)(const NSRange range, volatile BOOL * const stop))block;

ARCに切り替えるまで、これはすべて正常に機能しました。

それを呼び出しているコードを見ると、ブロックを一意に宣言するとアプリのクラッシュが停止しました。

id block = ^(const NSRange range, volatile BOOL * const stop) {
                [solutions_ addObject:object];
            };

[[puzzle_ stringForSolution:solution enumerateRangesOfString:word usingBlock:block];

ブロックがメソッド呼び出しでインラインで宣言されたとき、アプリがクラッシュしました。私たち(私)は、なぜこれで問題が解決するのか本当にわかりませんでしたが、壁に頭をぶつけ続けたくなかったので、一緒に進みました。

問題は、これがメソッドを呼び出すときのブロックのすべてのインライン宣言に当てはまるように見えることです。AFNetworkingライブラリをアプリに追加した後、アプリがクラッシュし続けました。問題は、このライブラリのすべてのコードを実際に調べて変更したくないということです。コードに何か問題があると思います。この問題は、ブロックをインラインで宣言したままにしておくとクラッシュを引き起こし続けます。ブロックを引き出して個別に宣言したときではありません。

私は他のいくつかのアプリでAFNetworkingを使用しています。明らかに、ブロックはインラインで宣言しても問題ないはずです。これにより、エラーはメソッドの呼び出しではなく、このプロジェクトのどこかでクラッシュしていると結論付けることができます。

4

1 に答える 1

0

問題の根本的な原因は、そのメソッドが返されたときにブロックパラメーターが実際に範囲外になることだと確信しています。私の理解では、ブロック パラメーターを取る Apple クラスは、block_copy() をすぐに ivar に実行します (つまり、block foo = block_copy(parameter))。

于 2012-09-25T00:36:30.920 に答える