【问题标题】:Why does Cocoa return an empty string occasionally?为什么 Cocoa 偶尔会返回一个空字符串?
【发布时间】:2009-03-03 22:59:28
【问题描述】:

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

char *hash = (char*) sqlite3_column_text(get_bookmark, 0);
NSString* postHash = [NSString stringWithUTF8String:hash];

这对我每次都有效;我从未见过它起作用。我的大多数用户都没有遇到问题(据我所知)。但是我发现 postHash 有时对于某些用户来说是一个空字符串 (@"")。

谁能解释一下原因?

更多背景/推测:

这似乎只发生在越狱手机上。他们有什么不同吗?我收集到通常可用的内存较少。还有什么可以在这里做出贡献的吗?

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

hash 肯定会返回一个非 NULL 值。如果我在此处强制为 NULL,则应用程序崩溃。同样,postHash 不是 nil,因为这也会导致应用程序崩溃(出于相同的原因)。

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

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

【问题讨论】:

  • “但是 Cocoa 是否有可能在这里返回一个空字符串而不是预期值?” “空字符串”可以是 NULL(C 字符串)或 nil(NSString)。空字符串完全不同:它是一个没有字符的字符串,而 NULL/nil 根本就不是字符串。
  • 这不是我对“空字符串”的理解。当我在上面说“空字符串”时,我的意思是“空字符串”,即 Objective-C 中的 @"" 或 C 中的 ""。nil/NULL 值会导致应用程序崩溃。
  • “Null”表示0。空字符为'\0';即0。空指针为0。C中没有“空字符串”这样的东西,因为如果它是空的,它就不是字符串;它只是 0。
  • 我们在技术方面达成一致,但不是术语。维基百科说:“空字符串,也称为空字符串,是长度为零的字符串。” (is.gd/lL90)
  • 它引用了 K&R,我查了一下,他们真的这么说。所以这个定义是真实的,但它仍然具有误导性。当你的意思是这样时,最好说清楚并总是说“空字符串”(或“长度为零的字符串”或类似的东西)。

标签: iphone objective-c cocoa memory-management


【解决方案1】:

但是我发现 postHash 有时对于某些用户来说是一个空字符串 (@"")。

谁能解释一下原因?

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

【讨论】:

  • 我同意这将是最有可能的情况,但正如问题中所述,我非常有信心它不能是空字符串。
  • 这不是“最可能的情况”;这是唯一的场景。 NULL 给你一个例外。任何非空字符串都会为您提供非空字符串。只有一个空字符串才能为您提供一个空字符串。简单证明:NSLog in (strlen(hash)) 和长度 out ([postHash length])。
【解决方案2】:

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

数据库正确填充。查询也是正确的。我的手机和我的用户之间的区别在于他们有越狱的手机。显然,越狱的 iPhone 有时使用的 SQLite 版本与 iPhone OS 的出货版本不同。

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

【讨论】:

  • 需要有一种方法来检测越狱手机,然后拒绝用户支持。你为此浪费了多少时间?它没有开启。
  • 很难确定,但我想我花了大约 20 个小时——我只是偶然找到了解决方案!另一方面,他们是付费客户。尽管如此,我已经说过我保留不支持越狱手机的权利。我在应用程序博客上写了更多:yummyapp.com/2009/05/pirates-and-jail-break.html
猜你喜欢
  • 2013-10-22
  • 2012-03-19
  • 1970-01-01
  • 1970-01-01
  • 2013-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多