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