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

时间:2009-03-03 22:59:29

标签: iphone objective-c cocoa memory-management

我的应用程序中有一些看起来像这样的代码:

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

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

任何人都可以解释原因吗?

更多背景/推测:

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

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

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

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

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

2 个答案:

答案 0 :(得分:6)

  

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

     

任何人都可以解释原因吗?

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

答案 1 :(得分:4)

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

正确填充数据库 。查询也是正确的。我的手机和用户之间的区别在于他们手机已经破了。显然,jail破损的iPhone有时会使用不同于运行版iPhone OS的SQLite版本。

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