为什么UPDATE语句适用于initWithFormat而NOT与stringWithFormat一起使用?

时间:2012-07-18 17:59:06

标签: iphone ios ipad sqlite

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

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

2 个答案:

答案 0 :(得分:2)

我猜它与字符串的内存管理有关,它可能没有被充分保留,因此它在被使用之前就被清理干净了。这两种方法之间的区别是here

答案 1 :(得分:0)

我刚从这个帖子中找到了一些有趣的东西:How to refresh TableView Cell data during an NSTimer loop

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

我引用了什么“petergb”说:

  

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

     

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

     

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