2014-12-03 5 views
-1

Может ли +[NSArray arrayWithObjects] и новый, литеральный синтаксис производить разные результаты?`arrayWithObjects` против нового синтаксиса Literal?

  1. Есть любой шанс, что новый синтаксис дает разные результаты? Пример случай 3 символьные строки:

    return [NSArray arrayWithObjects:@"one", @"two", @"three", nil];

    против

    return @[@"one", @"two", @"three"];

  2. Можно ли увидеть код макроса для буквального синтаксиса, и если да, то где? (Пожалуйста, поправьте меня, если этот вопрос не имеет смысла)
+0

Я действительно сомневаюсь, что это, любой шанс, вы можете описать ошибку? Может быть, мы можем помочь сузить его. –

+3

Всегда подозревайте, что _you_ что-то не так. Вы не будете успешным программистом, если будете постоянно подозревать компилятор, структуру и т. Д. Они знают больше, чем вы. Используйте отладчик, используйте журнал, отследите проблему. Ты не сказал, что это такое, но я гарантирую, что ошибка - это ты. – matt

+0

Нет, вы не можете увидеть «макрокод». Это не макрос. Это синтаксис языка. Нет ничего, чтобы «видеть». – matt

ответ

6
  1. Да, есть шанс, что разницы. Рассмотрим:

    NSString *v = nil; 
    NSArray *a1 = @[ @"bob", v, @"fred" ]; 
    NSArray *a2 = [NSArray arrayWithObjects: @"bob", v, @"fred", nil]; 
    

    Тогда попытка построить a1 вызывает исключение во время выполнения, и программа аварий, потому что вы пытались включить ноль в качестве NSArray. Попытка построить a2 создает массив из одного элемента, @"bob", потому что nil в v завершает список аргументов.

  2. Для буквенного синтаксиса нет «макрокода». Это часть исходного кода компилятора, который является C++. Посмотрите на method Sema::BuildObjCArrayLiteral in SemaExprObjC.cpp.

+0

Спасибо, это интересный случай. Так что, если все строки сами являются литералами, это различие невозможно, не так ли? –

+2

Справа. Хотя было бы полезно, если бы вы разместили свой точный код. –

+0

@ZevEisenberg TBH, соответствующий этому вопросу, как раз и заменит старый синтаксис нового синтаксиса на кучу строковых литералов. Ошибка, которую я пытаюсь исправить, является странной и прерывистой и существует где-то в огромной кодовой базе, для которой я являюсь автором (MIDI Designer). Поскольку ошибка проявилась только в бета-версии, а не в производстве, я занимаюсь git, чтобы понять, что происходит. Я просто хотел проверить, могу ли я исключить эту гипотезу, которую я могу сейчас. –

Смежные вопросы