Ответ 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];
создаст массив с одним элементом в этом случае.