В каких ситуациях нужно писать квалификатор __autoreleasing ownership в ARC?

Я пытаюсь завершить головоломку.

__strong - это значение по умолчанию для всех сохраняемых объектных указателей Objective-C, таких как NSObject, NSString и т.д.. Это сильная ссылка. ARC балансирует ее с помощью -release в конце области видимости.

__unsafe_unretained равен старому способу. Он используется для слабого указателя без сохранения удерживаемого объекта.

__weak подобен __unsafe_unretained, за исключением того, что это автообнуляющаяся слабая ссылка, означающая, что указатель будет установлен в nil, как только объект, на который ссылаются, будет деаллоцирован. Это устраняет опасность висячих указателей и ошибок EXC_BAD_ACCESS.

Но для чего именно нужно __autoreleasing? Мне трудно найти практические примеры, когда нужно использовать этот квалификатор. Я полагаю, что он нужен только для функций и методов, которые ожидают указатель-указатель, например:

- (BOOL)save:(NSError**);

или

NSError *error = nil;
[database save:&error];

которые в ARC должны быть объявлены так:

- (BOOL)save:(NSError* __autoreleasing *);

Но это слишком туманно, и я хотел бы полностью понять почему. Во фрагментах кода, которые я нашел, __autoreleasing размещается между двумя звездами, что выглядит странно для меня. Тип - NSError** (указатель-указатель на NSError), так зачем размещать __autoreleasing между звездами, а не просто перед NSError**?

Также, могут быть другие ситуации, в которых я должен полагаться на __autoreleasing.

114
задан mattjgalloway 7 September 2012 в 19:27
поделиться