Я пытаюсь решить головоломку.
__strongявляется значением по умолчанию для всех сохраняемых указателей объектов Objective-C, таких как NSObject, NSString и т. д. Это сильная ссылка. ARC уравновешивает это с помощью a -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.