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