Я пытаюсь завершить головоломку.
__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
.