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