Почему передача указателя NSString у меня не работает? - PullRequest
1 голос
/ 28 сентября 2011

У меня проблемы с передачей / приемом указателей 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;
}

Допустим, я вызываю addTo со входами 1234, «Дерево», «Растение с листьями»

Печать в первом блоке кода выводит то, что яотправлено в addTo, но печать в initWithPrimaryKey печатает следующее ...

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

Почему это так?Или еще .. почему это не печать, что я ожидаю?

Ответы [ 2 ]

0 голосов
/ 28 сентября 2011

%s используется для char* строк, но %@ должно использоваться с NSStrings. printf может поддерживать или не поддерживать %@, я не знаю. Если нет, вам нужно использовать cStringUsingEncoding или UTF8String из NSString для преобразования в char*, который вы можете использовать.

initWithPrimaryKey:pk:nam:descrip:db - недопустимый (или, по крайней мере, очень зацикленный) синтаксис, кстати, initWithPrimaryKey:(NSInteger) pk :(NSString*) nam: (NSString*) descrip: (sqlite3*) db.

Важно понимать разницу между NSString и char* строкой. NSString - это полноценный объект, имеющий около 50 методов, которые он поддерживает, чтобы делать всякие изящные / странные / (и иногда) непристойные вещи со строковыми значениями. Эти два способа ни в коем случае не являются взаимозаменяемыми. И в отличие от некоторых библиотек C ++, вы не можете заменить строку char* на NSString при вызове, и произойдет автоматическое преобразование.

Таким образом, использование "letters" для строки не даст чего-то пригодного для использования в качестве строки NSS - вы должны использовать @"letters".

0 голосов
/ 28 сентября 2011

При печати в NSLog строка NSString должна быть% @ не% s

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...