Имя селектора для литерального конструктора NSArray, например @[]?

Прошло много времени с тех пор, как Clang добавил синтаксис Objective-C для NSDictionary, NSArray, NSNumber, а также BOOL литералы, как @[object1, object2,] или же @{key : value}

Я ищу имя селектора, связанного с литералом массива, @[],

Я попытался выяснить, используя следующий код для NSArray, но я не увидел селектор, который казался правильным.

 unsigned int methodCount = 0;
 Method * methods = class_copyMethodList([NSArray class], &methodCount);

 NSMutableArray * nameOfSelector = [NSMutableArray new];
 for (int i = 0 ; i < methodCount; i++) {
    [nameOfSelector addObject:NSStringFromSelector(method_getName(methods[i]))];
}

2 ответа

Решение

@[] это не метод в NSArray, поэтому вы не найдете его там.

Компилятор просто переводит @[] в вызов [NSArray arrayWithObjects:count:], Как в нем в основном находит все @[] и заменяет его [NSArray arrayWithObjects:count:] (несущий через аргументы конечно)

Смотрите раздел Литералы здесь

@[]использования+arrayWithObjects:count:

Официальная Clang Документация

Массив буквенных выражений расширяется до вызовов +[NSArray arrayWithObjects:count:], который подтверждает, что все объекты не равны нулю. Вариадическая форма, +[NSArray arrayWithObjects:] использует nil в качестве ограничителя списка аргументов, что может привести к некорректным объектам массива.

Когда вы пишете это:

NSArray *array = @[ first, second, third ];

Это расширяется до этого:

id objects[] = { first, second, third };
NSArray *array = [NSArray arrayWithObjects:objects count:(sizeof(objects) / sizeof(id))];
Другие вопросы по тегам