Я работаю над существующей кодовой базой большого размера, и после обновления iOS SDK до 4.1 теперь я вижу очень странное поведение. Суть дела в том, что конкретный класс больше не будет выделяться - он выбрасывает неправильный доступ в obj_msgSend и, похоже, является объектом Class в стеке, который objc_msgSend не нравится - хотя на самом деле он не равен 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>
{
...
}
Любая помощь по этому вопросу очень ценится - это шоу шоу.
Спасибо