私は既存の大規模なコードベースに取り組んでおり、iOS SDKを4.1にアップグレードした後、非常に奇妙な動作が見られます。問題の核心は、割り当てられなくなる特定のクラスのように見えます-obj_msgSendに不正なアクセスをスローしており、実際にはNULLではありませんが、objc_msgSendが気に入らないスタック上のClassオブジェクトのようです。
元の失敗した行は次のようになりました:-
tileProjection = [[RMFractalTileProjection alloc] initFromProjection:proj tileSideLength:sideLength maxZoom:18];
問題を切り分けるためにこれを分解しました:-
RMFractalTileProjection *p = [RMFractalTileProjection alloc]; // <- this crashes
p = [p initFromProjection:proj tileSideLength:sideLength maxZoom:18];
tileProjection = p;
それから私はこれを試しました:-
Class c = NSClassFromString(@"RMFractalTileProjection");
assert(c);
NSLog( @"RMFractalTileProjection class(ptr) %p", c ); // <- prints an address OK
NSLog( @"RMFractalTileProjection class(obj) %@", c ); // <- crashes
デバッガーでは、Classオブジェクトは適切であるように見えますが、印刷しようとするとNSLogがクラッシュします。
注意すべき点の1つは、問題のクラスが次のように宣言されていることです。プロトコルが問題を引き起こしているかどうかはわかりません。この特定の部分はオープンソースコードの大きな塊であるため、このプロトコル要件を削除して、それが違いを生むかどうかを確認することは非常に困難です。
@interface RMFractalTileProjection : NSObject<RMMercatorToTileProjection>
{
...
}
これに関するどんな助けも大いに感謝します-それはショーストッパーです。
ありがとう