Преобразование проекта в 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;