После автоматического преобразования ARC: присвоение сохраненного объекта небезопасному свойству; объект будет освобожден после назначения - PullRequest
29 голосов
/ 17 марта 2012

Я только что преобразовал старый проект в ARC с помощью автоматического рефакторинга XCode.

@property (nonatomic, retain) NSMutableArray *cards;

был заменен на:

@property (nonatomic) NSMutableArray *cards;

Это имеет смысл, потому что я прочитал следующее: "сильный "является состоянием по умолчанию.Тем не менее, следующая строка дает мне ошибку в заголовке:

self.cards = [[NSMutableArray alloc] initWithCapacity:54];

Ошибка решается добавлением strong туда, где раньше было: retain:

@property (nonatomic, strong) NSMutableArray *cards;

Однако... если мне нужно вернуться и вставить strong в каждое объявление @property, которое было retain ... почему рефакторинг ARC удалил их всех?

Ответы [ 2 ]

44 голосов
/ 27 марта 2012

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

Он сказал, что и предупреждение, и документация неверны и будут исправлены.Пока это не сделано, я бы вообще избегал неявного значения по умолчанию !

Явное добавление "strong" (как предположил Б.Дж. Гомер) - это безопасный способ заставить замолчать предупреждение и быть совместимым.Но не думайте, что свойства не сохраняются по умолчанию.Также всегда ставьте здесь «слабый» или «назначенный».

Редактировать: документация клана теперь официально документирует это изменение.Предупреждение было исправлено .

Редактировать 2: Xcode 4.4, очевидно, включает в себя исправление.

8 голосов
/ 17 марта 2012

Неправильно выглядит, что он конвертировал nonatomic, retain в nonatomic.Я всегда видел, как он конвертируется в nonatomic, strong.Если вы можете создать простой проект, который конвертируется так, как вы его видели, тогда я предлагаю подать с него радар .

Я предполагаю, что вы используете последнюю версию Xcode.

...