Почему NSObject «isMemberOfClass: class» указывает __unsafe_unretained в автозавершении XCode?

Расплывчатый обзор заключается в том, что я пишу метод в категории NSArray , который будет принимать Class и фильтровать Array до элементов, которые являются членами этого класса. Что-то вроде:

@implementation NSArray(filter)
-(NSArray*)objectsOfClass:(Class)aClass {
   NSMutableArray *ret = [[NSMutableArray alloc] init];   
   for (id obj in self)
       if ([obj isMemberOfClass:aClass])
          [ret addObject:obj];

   return [NSArray arrayWithArray:ret];
}
@end

Сооо, с этим с дороги, на мой вопрос. NSObject.h показывает, что isMemberOfClass: имеет следующую подпись:

 -(BOOL)isMemberOfClass:(Class)aClass;

Когда я набираю этот метод в XCode, автозаполнение подсказывает подпись метода, которая выглядит так:

 [self isMemberOfClass:(__unsafe_unretained Class)]

Мои вопросы:

1) Why the discrepancy between the method prototype in NSObject.h and XCode's autocompletion?
2) In my own method (shown at the start of the this question), should I include the __unsafe_unretained modifier? If so, why? If not, why not?

Благодаря!

4
nl ja de

1 ответы

В отсутствие четкой квалификации владения выведено; обычно это __ strong , но в случае Class это __ unsafe_unretained . Это имеет смысл, поскольку объекты Class бессмертны и не нуждаются в управлении памятью вашим кодом.

Таким образом, Xcode просто делает неявное явное, и вам не нужно делать это самостоятельно.

6
добавлено
Я все еще пытаюсь понять разницу между объектами класса и другими объектами, используемыми в качестве параметров метода. Согласно Автоматическое подсчет ссылокobjective-c(ARC) : 1) id , Class , NSFoo * и т. д. являются «типами сохраняемых типов объектов» и 2) вообще ARC не выполняет операции сохранения/освобождения при передаче сохраняемого указатель как аргумент функции. - Итак, что вы имеете в виду с «это обычно __strong, но в случае класса это __unsafe_retained»? (Я не хочу критиковать, просто пытаюсь понять.)
добавлено автор Martin R, источник
Новая документация Clang/ARC еще более ясна: В «4.4.2 Косвенные параметры»: «если T является const-qual или Class, то он неявно квалифицирован с __unsafe_unretained, в противном случае он неявно квалифицируется с __autoreleasing».
добавлено автор Martin R, источник
@MartinR - Посмотрите в разделе 4.4 ссылки, которую вы цитировали, здесь говорится о выводах. Рассмотрим: если вы пройдете, скажите NSArray для метода и этот метод сохранит его в переменной экземпляра, тогда ARC (a) получит право собственности на переменную экземпляра как __ strong и (b) будет заявлять право собственности ( сохранить) переданный аргумент, когда он хранит его. Однако, поскольку объекты all типа Class бессмертны, ARC никогда не нуждается в управлении владением, а квалификатор собственности, который означает «оставьте меня в покое», - это __ unsafe_unretained , поэтому для переменных Class , которые выведены, а не __ strong .
добавлено автор CRD, источник
Имеет смысл! Благодаря ;)
добавлено автор Matt H., источник