【问题标题】:Why UPDATE statement works with initWithFormat and NOT with stringWithFormat?为什么 UPDATE 语句适用于 initWithFormat 而不适用于 stringWithFormat?
【发布时间】:2012-07-18 17:59:06
【问题描述】:

正如我在这里所说的那样,我的 UPDATE 语句有问题:Update issue with sqliteManager

我发现 initWithFormat 有效

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"];

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

【问题讨论】:

  • 您甚至没有使用任何格式说明符吗?为什么不直接使用stringWithString: 或initWithString:? (我猜这有点离题了。)

标签: iphone ios ipad sqlite


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我刚刚从这个帖子中发现了一些有趣的东西: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]。

    【讨论】:

      猜你喜欢
      • 2021-02-23
      • 2020-07-28
      • 2016-04-08
      • 1970-01-01
      • 2018-06-26
      • 1970-01-01
      • 2013-05-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多