Попытка привести указатель к указателю в ARC - PullRequest
1 голос
/ 14 мая 2019

Я получаю эту ошибку компилятора:

Неявное преобразование типа указателя без Objective C 'void * _Nullable 'для' NSObject * __ strong * 'запрещено с ARC

когда я пытаюсь скомпилировать этот старый код, который работал до ARC. Фактический код находится в цикле, управляемом массивом. Этот фрагмент представляет собой всего лишь один цикл кода, чтобы выделить ошибку без посторонних вещей.

- (void)myCode
{
    NSDictionary *sDict; // I want the @{ @"key" : @"value" } to end up here

    // this is in a loop to set several dictionaries
    // vcValue is set from a controlling array, but ends up like this:
    NSValue *vcValue = [NSValue valueWithPointer:&sDict];
    NSObject **vcPointer = [vcValue pointerValue]; // <<-- generates the error
    *vcPointer = @{ @"key" : @"value" }; // for sDict
}

Я использую NSObject, потому что указатель может быть на NSDictionary или NSArray, основываясь на управляющем массиве. В этом примере он указывает на словарь.

Как правильно определить vcPointer?

1 Ответ

1 голос
/ 14 мая 2019

Если вы не знаете, является ли это NSDictionary * или NSArray *, правильный тип - id.

NSDictionary *sDict;
NSValue *vcValue = [NSValue valueWithPointer:&sDict];
id __strong *vcPointer = (id __strong *)vcValue.pointerValue;
*vcPointer = @{ @"key": @"value" };
...