Я пытаюсь закончить головоломку.
__strong
является значением по умолчанию для всех сохраняемых указателей объектов Objective-C, таких как NSObject, NSString и т.д. Это сильная ссылка. ARC балансирует его с помощью -release
в конце области.
__unsafe_unretained
равен старому. Он используется для слабого указателя без сохранения сохраняемого объекта.
__weak
похож на __unsafe_unretained
, за исключением того, что он автоматически указывает на то, что указатель будет установлен на нуль, как только ссылочный объект будет освобожден. Это устраняет опасность оборванных указателей и ошибок EXC_BAD_ACCESS.
Но для чего именно __autoreleasing
полезно? Мне сложно найти практические примеры, когда мне нужно использовать этот квалификатор. Я считаю, что это только для функций и методов, которые ожидают указатель-указатель, например:
- (BOOL)save:(NSError**);
или
NSError *error = nil;
[database save:&error];
который под ARC должен быть объявлен следующим образом:
- (BOOL)save:(NSError* __autoreleasing *);
Но это слишком расплывчато, и я хотел бы полностью понять, почему. Скрытые фрагменты кода, которые я нахожу, содержат __autoreleasing между двумя звездами, что выглядит странно для меня. Тип NSError**
(указатель-указатель на NSError), поэтому зачем размещать __autoreleasing
между звездами, а не просто перед NSError**
?
Кроме того, могут быть и другие ситуации, в которых я должен полагаться на __autoreleasing
.