无法将接口类型按值'NSString'的对象传递给可变参数函数;格式字符串的预期类型'id'



我在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=@"jijij";为什么会发生这种事,你能解释一下吗?

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

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

问题编辑

在该语句中,const属性指的是所指向的值,而不是指针的值。就实现而言,这并不意味着什么,因为该字符串无论如何都不会更改。我相信它允许编译器优化。

最新更新