【发布时间】: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