2009-08-05 49 views
1

我明白unsigned char *char *类型之间的差异。我也知道如何使用的reinterpret_cast投的unsigned char *char *在C++。定义为从无符号字符*投的行为为char *在Objective-C

我使用的Objective-C的sqlite3的,我试图从呼叫得到NSString

sqlite3_column_text(...); 

要做到这一点,我基本上做的:

char *cParam = (char *)sqlite3_column_text(compiledStatementPtr, 0); 
NSString *aParam = nil; 
if (cParam) { 
    aParam = [NSString stringWithUTF8String:cParam]; 
} 

sqlite3_column_text(),然而,返回unsigned char *,我很担心投给char *行为。我读过,中投是具体的实行,我想知道这是否是在Objective-C,或者如果我完全找错了树一个安全的投?

+0

BTW reinterpret_cast似乎不可用于ObjC,除非它在我不知道的头文件中 - 这是可能的。 – jcb 2009-08-05 19:46:25

+1

'reinterpret_cast'是Objective-C中不可用的C++操作符。 – notnoop 2009-08-05 20:06:55

回答

4

你没有太多的担心,由于演员。事实上,苹果公司的代码示例使用您使用的是完全相同的代码模式:

self.title = 
    [NSString stringWithUTF8String:(char *)sqlite3_column_text(init_statement, 0)]; 

(从SQLite Book ListBook.m类)。

我认为你应该更关心的实际上有UTF-8字符串数据库。

+0

“我认为你应该更关心实际拥有UTF-8字符串的数据库。”是的,今天焦炭的想法毫无意义。如果所有这些API和类型今天都要重做,那么我们可能不会使用像char这样具有误导性名称的类型,而只是使用uint8_t。所有NSString关心的都是sqlite3_column_text返回值指向的字节值。投射指针不会改变字节的值。你可以将指针转换成类似NSRect *的东西,并得到编译器警告,但代码仍然可以正常工作。 – 2009-08-06 04:21:26