Отправка '__autoreleasing id *' параметру типа '__unsafe_unretained id *' - PullRequest
1 голос
/ 03 марта 2012
Sending '__autoreleasing id *' to parameter of type '__unsafe_unretained id *' changes retain/release properties of pointer

Может ли кто-нибудь помочь мне решить эту проблему!

1 Ответ

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

Я только начинаю набирать скорость на 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.

...