Использование @[array, of, items] vs [NSArray arrayWithObjects:]

Есть ли разница между

NSArray *myArray = @[objectOne, objectTwo, objectThree];

и

NSArray *myArray = [NSArray arrayWithObjects:objectOne, objectTwo, objectThree, nil];

Один из них предпочтительнее другого?

Ответ 1

Они почти идентичны, но не полностью. Документация Clang в Objective-C литералах гласит:

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

Итак,

NSArray *myArray = @[objectOne, objectTwo, objectThree];

будет генерировать исключение во время выполнения, если objectTwo == nil, но

NSArray *myArray = [NSArray arrayWithObjects:objectOne, objectTwo, objectThree, nil];

создаст массив с одним элементом в этом случае.

Ответ 2

Нет. Во время компиляции литералы @[...] будут изменены на arrayWithObjects:

Единственное различие заключается в том, что @[...] поддерживается только в более новых версиях компилятора LLVM.