Я намагаюся завершити пазл.
__strong
є за замовчуванням для всіх вказівників об'єкта, доступних до об'єктів, таких як 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 *);
Але це занадто розпливчасто, і я хотів би повністю зрозуміти, чому . У кодових фрагментах я знаходжу місце __авторелізингу між двома зірками, що мені здається дивним. Тип є NSError**
(покажчик-покажчик на NSError), тож чому розміщувати __autoreleasing
між зірками, а не просто перед NSError**
?
Також можуть бути інші ситуації, в яких я повинен покластися __autoreleasing
.