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

Я пытаюсь преобразовать проект в 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 Ответ

5 голосов
/ 06 марта 2012

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

__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;
...