Преобразование проекта в ARC с двойным назначением указателя косвенного

Я пытаюсь преобразовать проект в ARC. Проект имеет направленный ациклический словесный граф, который в основном означает множество указателей на двойную косвенность повсюду.

Это довольно сложная задача для перехода на ARC, и одна проблема, в частности, поставила меня в тупик.

Вот сценарий.

Допустим, у вас есть NSString *:

NSString *b = [[NSString alloc] initWithString:@"hello"];

У вас также есть двойной тип косвенного обращения:

__unsafe_unretained NSString **a;

Вы хотите назначить одно другому следующим образом:

    a = &b;

Это дает ошибку преобразования:

error: assigning 'NSString *__strong *' to 'NSString *__unsafe_unretained *' changes retain/release properties of pointer

изменения b в __unsafe_unretained не работает Я также попробовал различные броски моста. Я что-то упускаю здесь очевидное?

Есть идеи?

Спасибо!

1 ответ

Решение

Вы можете использовать указатель на постоянный указатель, чтобы избежать проблем с управлением памятью:

__attribute__((objc_precise_lifetime)) NSString *b = [[NSString alloc] initWithString:@"hello"];
NSString *const*a;
a = &b;

вам нужно использовать objc_precise_lifetime, чтобы сделать b доступны для всего контекста (ARC может выпустить b после последней ссылки)

РЕДАКТИРОВАТЬ: Это также может быть использовано (но знать об управлении вашим двойным указателем)

NSString *b = [[NSString alloc] initWithString:@"hello"];
NSString *__strong*a;
a = &b;
Другие вопросы по тегам