我正在处理现有的大型代码库,在将 iOS SDK 升级到 4.1 后,我现在看到了非常奇怪的行为。问题的症结似乎是一个将不再分配的特定类——它在 obj_msgSend 中引发了错误的访问,并且似乎是 objc_msgSend 不喜欢的堆栈上的 Class 对象——尽管它实际上不是 NULL。
原来的失败线如下所示:-
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 在尝试打印它时会崩溃。
需要注意的一件事:有问题的类声明如下,我不确定协议是否导致问题。因为这个特定部分是一大块开源代码,所以很难删除这个协议要求,看看这是否会产生影响。
@interface RMFractalTileProjection : NSObject<RMMercatorToTileProjection>
{
...
}
对此的任何帮助都非常感谢 - 这是一个表演停止者。
谢谢