Iphone 为什么Cocoa偶尔会返回空字符串?

Iphone 为什么Cocoa偶尔会返回空字符串?,iphone,objective-c,cocoa,memory-management,Iphone,Objective C,Cocoa,Memory Management,我的应用程序中有一些代码如下所示: char *hash = (char*) sqlite3_column_text(get_bookmark, 0); NSString* postHash = [NSString stringWithUTF8String:hash]; 这对我每次都有效;我从未见过它不起作用。据我所知,我的大多数用户都没有遇到问题。然而,我发现对于某些用户来说,postHash有时是一个空字符串(@“) 有人能解释为什么吗 更多背景/推测: 这似乎只发生在越狱的手机上。他们有

我的应用程序中有一些代码如下所示:

char *hash = (char*) sqlite3_column_text(get_bookmark, 0);
NSString* postHash = [NSString stringWithUTF8String:hash];
这对我每次都有效;我从未见过它不起作用。据我所知,我的大多数用户都没有遇到问题。然而,我发现对于某些用户来说,
postHash
有时是一个空字符串(
@“

有人能解释为什么吗

更多背景/推测:

这似乎只发生在越狱的手机上。他们有什么不同吗?我推测可用内存通常较少。还有什么能在这里起作用的吗

postHash
用于表单元格中,有时会被视为正确填充,因此我有理由相信数据库调用会起作用。事实上,如果数据库也有一个空字符串,那是因为一段非常相似的代码,所以问题仍然存在

hash
肯定会返回一个非空值。如果我在此处强制为空,应用程序将崩溃。类似地,
postHash
不是
nil
,因为这也会使应用程序崩溃(出于相同的原因)

我认为这可能与记忆有关。如果该方法试图在调用
-didReceiveMemoryWarning
之前分配过多内存,会发生什么?我知道,在某个时刻,跳板会弹出应用程序。但Cocoa是否可能在此处返回空字符串而不是预期值?我听说过一些报告,据我所知,这只能是由于存在一个空字符串而导致的,而这个空字符串应该存在更长的时间

欢迎任何其他推测、理论或想法

然而,我发现对于某些用户来说,
postHash
有时是一个空字符串(
@“

有人能解释为什么吗


因为
hash
是一个空字符串(
hash[0]='\0'
)。

我终于找到了解决方法。我将给彼得一个公认的答案,因为他是对的,但我得到一个空字符串的原因是。。。有趣

数据库已正确填充。这个查询也是正确的。我的手机和我的用户之间的区别在于,他们的手机已经入狱。显然,被判入狱的iPhone有时使用的SQLite版本与iPhone操作系统的出货版本不同


版本更改暴露了我的代码中的一个错误,导致其中一个参数设置不正确,并且
sqlite3\u column\u text
返回空字符串。

“但是Cocoa是否可能在此处返回空字符串而不是预期值?”空字符串可能是null(C字符串)或nil(NSString)。空字符串完全不同:它是一个没有字符的字符串,而NULL/nil根本不是字符串。这不是我对“空字符串”的理解。当我在上面说“空字符串”时,我指的是“空字符串”,即Objective-C中的“@”或C中的“。空/空值会导致应用程序崩溃。“空”表示0。空字符为“\0”;i、 e.,0。空指针为0。在C中没有“空字符串”这样的东西,因为如果它是空的,它就不是字符串;只是0。我们在技术方面达成一致,只是在术语方面没有达成一致。维基百科说:“一个空字符串,也称为空字符串,是一个长度为零的字符串。”()它引用了K&R,我查了一下,他们真的这么说。所以这个定义是真实的,但它仍然有误导性。如果你是这个意思的话,最好说清楚,总是说“空字符串”(或“长度为零的字符串”或任何类似的词)。我同意这是最有可能的情况,但正如问题中提到的,我很有信心它不可能是空字符串。这不是“最有可能的情况”;这是唯一的情况。NULL将为您获取一个异常。任何非空字符串都会得到一个非空字符串。只有空字符串才能获得空字符串。简单证明:NSLog长度输入(strlen(hash))和长度输出([postHash length])。需要有一种方法来检测越狱手机,然后拒绝用户支持。你为此浪费了多少时间?它没有打开。很难确定,但我想它花了我大约二十个小时——我只是意外地找到了解决办法!另一方面,他们是在付钱给顾客。不过,我已经说过,我保留不支持越狱手机的权利。我在apps博客上写了更多内容: