Я просто встаю, чтобы ускорить работу с ARC, но у меня была такая же ошибка, поэтому, возможно, я смогу помочь в этом.
__unsafe_unretained
используется, если вы хотите поддерживать iOS 4+. Для iOS 5.0+ __weak
следует использовать. Разница заключается в том, что указатель __weak
обнуляется. Значение, когда ничто иное не ссылается на объект и не освобождается, указатель __weak
будет установлен на ноль. Поэтому, если вы ссылаетесь на него, вы не получите авария EXC_BAD_ACCESS
.
Как и все остальные объекты, такие как тип объекта и квалификаторы, для объектов Objective-C в ARC теперь необходимо указать время жизни. Это так, что ARC знает, как синтезировать вызовы сохранения/выпуска.
Если вы не укажете что-нибудь по умолчанию, будет __strong
.
Эти спецификаторы срока службы должны соответствовать.
В вашем случае вы назначаете один указатель, который равен __unsafe_unretained
, другому __strong
.
Чтобы устранить, измените указатель приема на __unsafe_unretained
. Это может означать добавление спецификатора жизненного цикла к сигнатуре метода. Например:
- (void)myMethod:(__unsafe_unretained NSString *)aString
{
}
Не забывайте, что __unsafe_unretained
как это тезка описывает. Это не безопасно, и оно не сохраняется! Поэтому вам лучше сохранить этот объект в другом месте и не ссылаться на него в методе, подобном этому после его выпуска. Вы просто использовали бы это для слабых ссылок в делегатах, например, для отношений родителя/ребенка. Для всего остального, в частности нормальных Objective-C ivars, вы должны использовать __strong
.