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

时间:2011-09-28 00:19:41

标签: 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);
    //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

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

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

这是为什么?或者更多..为什么不打印我期望的东西?

2 个答案:

答案 0 :(得分:0)

在NSLog中打印时,NSString应为%@ not%s

答案 1 :(得分:0)

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

initWithPrimaryKey:pk:nam:descrip:db无效(或至少非常循环)语法,BTW,initWithPrimaryKey:(NSInteger) pk :(NSString*) nam: (NSString*) descrip: (sqlite3*) db

了解NSStringchar*字符串之间的区别非常重要。 NSString是一个成熟的对象,它支持大约50种方法,可以使用字符串值来处理所有类型的整洁/奇怪/(偶尔)淫秽的东西。这两者在任何方面都不可互换。与某些C ++库不同,您无法在调用中用char*字符串替换NSString并自动进行转换。

因此,使用"letters"作为字符串将不会产生可用作NSString的内容 - 您必须使用@"letters"