2012-03-03 3 views

ответ

4

Я просто встаю, чтобы ускорить работу с 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.