Ошибка с быстрым перечислением на NSDictionary - PullRequest
2 голосов
/ 06 ноября 2011

Благодаря этому вопросу / ответу Автоматический подсчет ссылок: ошибка с быстрым перечислением Я решил часть того, что сводит меня с ума.

Тем не менее, я все еще получаю сообщение об ошибке " Присвоение 'NSDictionary * __ strong ' '__unsafe_unretained id ' изменяет свойства сохранения / освобождения указателя ". Я прочитал Руководство по программированию ARC и части, связанные с преобразованием указателей, но, к сожалению, я еще не достаточно хороший программист на c.

См строку кода с комментарием. Любая помощь будет очень ценится. Заранее спасибо.

- (NSUInteger) countByEnumeratingWithState: (NSFastEnumerationState *)state
                               objects: (id __unsafe_unretained *)buffer
                                 count: (NSUInteger)bufferSize
{
    if (*enumRows = [self getPreparedRow]) {
        state->itemsPtr = enumRows; // Assigning 'NSDictionnary *__strong *' to '__unsafe_unretained id*' changes retain/release properties of pointer
        state->state = 0;
        state->mutationsPtr = &state->extra[0]; // was state->mutationsPtr = (unsigned long *) self; before
        return 1;
    } else {
        return 0;
    }
}

с этим объявлением в .h файле

@interface BWDB : NSObject <NSFastEnumeration> {
    NSDictionary * enumRows[1];
}

1 Ответ

2 голосов
/ 06 ноября 2011

Это все исправит.

@interface BWDB : NSObject <NSFastEnumeration> {
     __unsafe_unretained NSDictionary *enumRows[1];
}

По коду, который вы разместили, это должно быть совершенно безопасно, так как вы назначаете его каждый раз перед проверкой. На самом деле вообще нет необходимости делать эту переменную экземпляром.

Вы можете просто сделать что-то вроде:

{
    __unsafe_unretained NSDictionary *enumRows[1];
    if ((*enumRows = [self getPreparedRow])) {
        state->itemsPtr = NULL;
        state->itemsPtr = enumRows;
        state->state = 0;
        state->mutationsPtr = &state->extra[0];
        return 1;
    } else {
        return 0;
    }
}

Следует отметить, что наличие массива типа pointer [] для NSDictionaries невелико. Было бы гораздо выгоднее просто использовать NSArray для хранения ваших NSDictionaries.

...