Java всегда является передачей значением, без исключений, когда-либо .
Поэтому как получается, что кто-либо может быть вообще смущен этим и полагать, что Java является передачей ссылкой, или думают, что у них есть пример Java, действующего как передача ссылкой? Ключевой пункт - то, что Java никогда не обеспечивает прямой доступ к значениям сами объекты , в никакой обстоятельства. Единственный доступ к объектам через ссылка к тому объекту. Поскольку объекты Java всегда , получил доступ через ссылку, а не непосредственно, распространено говорить о полях и переменных и аргументы метода как являющийся объекты , когда педантично они - [только 1 110] ссылки на объекты . беспорядок останавливает от этого (строго говоря, неправильный) изменение в номенклатуре.
Так, при вызове метода
int
, long
, и т.д.), передача значением фактическое значение из примитива (например, 3). Поэтому, если Вы имеете doSomething(foo)
и public void doSomething(Foo foo) { .. }
, два Foos скопировали ссылки что точка к тем же объектам.
Естественно, передающий значением ссылка на объект смотрит очень как (и неотличимо на практике от), передача объекта ссылкой.
Правильно ли вы размещаете скобки? Я не думаю, что NSLog ()
любит принимать только один аргумент, а именно то, что вы ему передаете. Кроме того, он уже выполняет форматирование за вас. Почему бы просто не сделать это?
NSLog(@"%@ %@, %@",
errorMsgFormat,
error,
[error userInfo]);
Или, если вы говорите, что errorMsgFormat
- это строка формата с одним заполнителем, вы пытаетесь это сделать?
NSLog(@"%@, %@", [NSString stringWithFormat:errorMsgFormat, error],
[error userInfo]);
Xcode is complaining because this is a security problem.
Here's code similar to yours:
NSString *nameFormat = @"%@ %@";
NSString *firstName = @"Jon";
NSString *lastName = @"Hess %@";
NSString *name = [NSString stringWithFormat:nameFormat, firstName, lastName];
NSLog(name);
That last NSLog statement is going to be executing the equivalent of this:
NSLog(@"Jon Hess %@");
That's going to cause NSLog to look for one more string argument, but there isn't one. Because of the way the C language works, it's going to pick up some random garbage pointer from the stack and try to treat it like an NSString. This will most likely crash your program. Now your strings probably don't have %@'s in them, but some day they might. You should always use a format string with data you explicitly control as the first argument to functions that take format strings (printf, scanf, NSLog, -[NSString stringWithFormat:], ...).
As Otto points out, you should probably just do something like:
NSLog(errorMsgFormat, error, [error userInfo]);
Самый быстрый способ исправить это - добавить @ "% @ ",
в качестве первого аргумента вашего вызова NSLog
, то есть
NSLog(@"%@", [NSString stringWithFormat: ....]);
Хотя вам, вероятно, следует рассмотреть ответ Шестнадцати Отто.
NSLog () ожидает форматную строку, а передается просто строка. Вам не нужно использовать stringWithFormat :, вы можете просто сделать:
NSLog (@ "% @% @,% @", errorMsgFormat, error, [error userInfo])
И тогда предупреждение исчезнет .
Если вы хотите избавиться от предупреждения "формат не строковый литерал и отсутствие аргументов формата «раз и навсегда, вы можете отключить параметр предупреждения GCC« Typecheck Calls to printf / scanf »(GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = NO) в настройках вашей целевой сборки.
Я просто передавал nil, чтобы свести на нет предупреждения, может это сработает для вас?
NSLog(myString, nil);
FWIW, это также относится и к разработчикам iPhone. Я кодирую SDK 3.1.3 и получил ту же ошибку с той же проблемой (вложение stringWithFormat внутри NSLog ()). Сикстен и Джон в деньгах.
Окончательный ответ: как сказал Джон Хесс, это проблема безопасности, потому что вы передаете WHATEVER в функцию, ожидающую строку формата. То есть он будет оценивать все спецификаторы формата ВНУТРИ строки any. Если их нет - круто, но если есть, могут случиться плохие вещи.
Таким образом, правильнее всего будет ИСПОЛЬЗОВАТЬ строку формата напрямую, например
NSLog(@"%@", myNSString);
Таким образом, даже если в myNSString есть спецификаторы формата, они не будут оцениваться NSLog.