1

正如我在这里所说的那样,我的 UPDATE 语句有问题:使用 sqliteManager 更新问题

我发现initWithFormat WORKS

NSString *sqlStr = [[NSString alloc] initWithFormat:@"UPDATE User SET Name = :Name WHERE Id = :Id"];

但不是 stringWithFormat:

 NSString* sqlStr = [NSString stringWithFormat:@"UPDATE User SET Name = :Name WHERE Id = :Id"];

为什么会这样?我想了解背后的逻辑/推理..

4

2 回答 2

2

我猜它与字符串的内存管理有关,它可能没有被充分保留,所以它在被使用之前被清理掉了。两种方法的区别在这里定义

于 2012-07-18T18:05:55.557 回答
0

我刚刚从这个线程中发现了一些有趣的东西:How to refresh TableView Cell data during an NSTimer loop

我相信这就是背后的原因..

我引用“petergb”的话:

[NSString stringWithFormat:...]返回一个自动释放的对象。在控制从程序代码返回到苹果提供的运行循环代码后,自动释放的对象被释放。它们或多或少是一种方便,因此我们不必在这里和那里释放我们使用一次或两次的所有小对象。(例如,想象一下如果您必须释放使用 @"" 语法创建的每个字符串会是多么乏味......)

我们可以告诉stringWithFormat:返回一个自动释放的对象,因为按照惯例,名称不以 alloc 或 copy 开头的方法总是返回自动释放的对象。像这样的方法被称为“出售”一个对象。我们可以在不久的将来使用这些对象,但我们不“拥有”它(即,在我们将控制权交还给系统后,我们不能指望它存在。)如果我们想获得一个出售对象的所有权,我们必须在它上面调用 [object retain],然后它会一直存在,直到我们显式调用 [object release] 或 [object autorelease],如果我们在失去对它的引用之前不调用它的 release 或 autorelease通过将变量更改为其他内容,我们将泄漏它。

与[[NSString alloc] initWithFormat:对比。此方法“创建”一个对象。我们拥有它。同样,它会一直存在,直到我们明确调用 [object release]。

于 2012-07-19T08:22:37.437 回答