Objective c 为什么传递NSString指针对我不起作用?

Objective c 为什么传递NSString指针对我不起作用?,objective-c,pointers,nsstring,Objective C,Pointers,Nsstring,我在通过函数调用传递/接收NSString指针时遇到问题。我希望有人能帮我看看我做错了什么 这是我的第一节课 void addTo(int pk, NSString* nam, NSString *descrip) { //open the database sqlite3 *db; db = [Item openDB:databasePath]; printf("'%i', '%s', '%s'", pk, nam, descrip); //c

我在通过函数调用传递/接收NSString指针时遇到问题。我希望有人能帮我看看我做错了什么

这是我的第一节课

void addTo(int pk, NSString* nam, NSString *descrip)
{    
    //open the database
    sqlite3 *db;
    db = [Item openDB:databasePath];

    printf("'%i', '%s', '%s'", pk, nam, descrip);
    //create new item with key, name, description, and database
    Item *Obj = [[Item alloc]initWithPrimaryKey:pk:nam:descrip:db];
                          .
                          .
                          .
}
这就是上面调用的Item.m中的函数

- (id) initWithPrimaryKey:(NSInteger) pk :(NSString*) nam: (NSString*) descrip: (sqlite3*) db{

    printf("'%i', '%s', '%s'", pk, nam, descrip);
                         .
                         .
                         .
    return self;
}
假设我用输入1234调用addTo,“Tree”,“plant with leaves”

第一个代码块中的打印输出我发送给addTo的内容,但initWithPrimaryKey中的打印输出以下内容

'1234', 'P?a', 'P?a' 

为什么会这样?或者更多。。为什么不打印我期望的内容?

在NSLog中打印时,NSString应该是%@而不是%s

%s
用于
字符*
字符串,但是
%@
应该与NSString一起使用
printf
可能支持也可能不支持
%@
,我不知道。如果没有,则需要使用NSString的CStringUsingEncode或UTF8String转换为可以使用的
char*

initWithPrimaryKey:pk:nam:descripp:db
语法无效(或至少非常循环),顺便说一句,正如
initWithPrimaryKey:(NSInteger)pk:(NSString*)nam:(NSString*)descripp:(sqlite3*)db
一样

理解
NSString
char*
字符串之间的区别很重要。NSString是一个成熟的对象,它支持大约50个方法来使用字符串值执行各种整洁/奇怪/(偶尔)淫秽的操作。这两者在任何方面都不能互换。与一些C++库不同,不能在调用中使用<代码> char */CONT>字符串来代替调用中的<代码> NString < /Cord>,并发生自动转换。
因此,对字符串使用
“字母”
不会产生可用作NSString的内容——您必须使用
@“字母”

哦,我明白了。我将尝试使用NSLog。这仍然不能解释为什么带有%s的printf可以在第一个函数中工作,而不能在第二个函数中工作。@James调用第一个函数时,是否键入“Tree”或@“Tree”?obj-c NString文本应该写为latterIt的“Tree”。这是另一件需要考虑的事情。我从C#类外部访问addTo函数,所以我有点不确定如何将C#字符串传递到Objective-C字符串中。我不太明白您在这里写了什么。从我的判断来看,以上不是有效的objective-c。哦,等等。您是否使用没有名称的参数?那么您的选择器是initWithPrimaryKey:::我猜?对不起,我不太明白您的意思。选择器?“选择器”是Objective-C表示方法名。好的,谢谢。我对Objective-c有点陌生。将变量传递给对象的更好方法是什么?您不必给参数指定外部名称,但正如您所说的,这有点难看一般来说,Objective-C参数列表是“关键字:(type)formalParam”的重复序列。也有其他形式,但在正常情况下,它们是不受鼓励的,不太可能被其他人理解。“调用”是
[objectPtr关键字1:actualParm2关键字2:actualParm2…]。请注意,“方法名”实际上由所有连在一起的关键字组成——对于带有parm的方法,没有单独的方法名。@ZakyGerman——是的,但大多数人(包括我自己)都记不起匿名parm列表的规则,最好避免使用。对于方法名的部分,我认为是“标签”可能是比“关键字”更好的术语。与其他语言相比,将它们称为“关键字”可能意味着它们是可选的,或者它们的顺序可以更改。