Отладка XCode: исключение кэшируется? - PullRequest
0 голосов
/ 06 июля 2011

У меня проблема с обработкой кэшированных ошибок в X-Code. Я закомментировал конкретную строку, но я все еще получаю ту же ошибку для этой строки.

Я очистил проект, удалил папку сборки, заменил (удалил и снова импортировал) все ссылки. Но все равно я получаю ошибку в строке, где ничего нет. Даже если я закомментирую все, я получаю ту же ошибку.

- (void) setTileSource: (id<RMTileSource>)newTileSource
{
    if (tileSource == newTileSource)
        return;

    RMCachedTileSource *newCachedTileSource = [RMCachedTileSource cachedTileSourceWithSource:newTileSource];

    newCachedTileSource = [newCachedTileSource retain];
    [tileSource release];
    tileSource = newCachedTileSource;

---> вот исключение SIGABRT

     // NSAssert(([tileSource minZoom] - minZoom) <= 1.0, @"Graphics & memory are 
    [projection release];
    projection = [[tileSource projection] retain];

    [mercatorToTileProjection release];
    mercatorToTileProjection = [[tileSource mercatorToTileProjection] retain];

    [imagesOnScreen setTileSource:tileSource];

        [tileLoader reset];
    [tileLoader reload];
}

Ответы [ 3 ]

1 голос
/ 06 июля 2011

Подозреваю, это означает, что исключение не вызвано строкой, которую вы закомментировали.

Во-первых, почему вы делаете это:

newCachedTileSource = [newCachedTileSource retain];

retain возвращает себя. Вам не нужно присваивать результат одному и тому же указателю объекта. Если переопределения библиотеки сохраняются для возврата чего-то другого, библиотека разбивается.

Во-вторых, я думаю, что это может быть ошибкой:

[projection release];
projection = [[tileSource projection] retain];

Если projection == [tileSource projection] до релиза, возможно, что он каким-то образом выходит из-под контроля. Проблема исчезнет, ​​если вы сделаете:

RMProjection* newProjection = [[tileSource projection] retain];
[projection release];
projection = newProjection;

В идеале вы должны создать синтезированное свойство retain для проекции (фактически проекция может просто получить значение из tileSource) следующим образом:

-(RMProjection*) projection
{
    return [[self tileSoruce] projection];
}

То же самое для mercatorToTileProjection.

1 голос
/ 06 июля 2011

Разве вы не должны сохранить titleSource?Попробуй,

tileSource = [newCachedTileSource copy];
0 голосов
/ 06 июля 2011

Изменение [tileSource release]; в [tileSource autorelease];

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...