Objective c 为什么传递NSString指针对我不起作用?
我在通过函数调用传递/接收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
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列表的规则,最好避免使用。对于方法名的部分,我认为是“标签”可能是比“关键字”更好的术语。与其他语言相比,将它们称为“关键字”可能意味着它们是可选的,或者它们的顺序可以更改。