无法通过值将接口类型为“NSString”的对象传递给variadic函数;格式字符串的预期类型为“id”

时间:2015-11-29 05:49:50

标签: ios objective-c nsstring

我在X-Code中编写了以下代码,

NSString  *myString = @"testString";
NSLog(@"*myString = %@", *myString);

我收到了以下错误,

  

无法通过值将接口类型为“NSString”的对象传递给variadic函数;格式字符串的预期类型是'id'

有人可以告诉我这是什么意思吗? “* myString”代表什么? 我们知道,如果我们编写如下代码,则没有错误,

char testchar = 'f';
char *char1 = &testchar;
NSLog(@"*char1 = %c",*char1);

为什么NSString不能像这种情况一样写?

@ Avi,感谢您的解释,原来,我想问的是我看到了以下声明和定义:

NSString const *BNRNextItemValuePrefsKey1 = @"NextItemValue";

从我的理解BNRNextItemValuePrefsKey1指向常量@“NextItemValue”的指针 但是当我执行以下操作时,没有错误,     BNRNextItemValuePrefsKey1 = @“jijijij”; 为什么会这样,你能解释一下吗?

1 个答案:

答案 0 :(得分:0)

语法*myString取消引用指针myString。它告诉编译器传递指针指向的内存位置包含的值,而不是传递指针本身的值。示例为您提供错误的原因是因为Objective-C不允许按值传递对象。您只能传递指向对象的指针。错误消息中对id的引用指出%@格式字符串用于打印对象。确切地说,为任何对象打印的内容取决于- description对该对象类型的实现。

指向char指针的第二个示例有效,因为Objective-C在传递char的值方面没有问题。

问题编辑

在该语句中,const属性引用指向的值,而不是指针的值。在实现方面,它并没有多大意义,因为该字符串无论如何都不会改变。我相信它允许编译器优化。