2012-07-18 384 views
1

我是有我的UPDATE語句的問題,我告訴這裏:Update issue with sqliteManager爲什麼UPDATE語句適用於initWithFormat而不適用於stringWithFormat?

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

爲什麼這是這樣?我想了解背後的邏輯/推理..

+1

你甚至沒有使用任何格式說明符?爲什麼不使用'stringWithString:'或'initWithString:'? (這是我猜的一種偏離主題。) – 2012-07-18 18:14:08

回答

0

我剛剛發現從這個線程一些有趣的事情:How to refresh TableView Cell data during an NSTimer loop

這一點,我相信,這是背後的原因..

我引述「petergb」說:

[NSString stringWithFormat:...]返回一個自動釋放對象。在控制從程序代碼返回到蘋果提供的運行循環代碼後,自動釋放的對象被釋放。它們或多或少是一種便利,所以我們不必釋放我們在這裏和那裏使用一次或兩次的所有小對象。 (例如,想象那將是多麼乏味,如果你不得不釋放你用@「」語法創建的每個字符串...)

我們可以告訴stringWithFormat:因爲,按照慣例返回一個自動釋放的對象,方法誰的名字不以alloc或者replicate開始總是返回自動釋放的對象。像這樣的方法被認爲是「售賣」一個物體。我們可以在不久的將來使用這些對象,但我們不會「擁有」它(即,在我們將控制權交還給系統後,我們不能指望它在那裏)。如果我們想要承擔出售對象的所有權,我們必須在它上面調用[object retain],然後它會一直存在,直到我們明確地調用[object release]或[object autorelease],並且在我們失去對它的引用之前我們沒有調用release或autorelease通過將變量改爲別的東西,我們會泄漏它。

對比[[NSString alloc] initWithFormat:。這種方法「創建」一個對象。我們擁有它。再次,它會一直存在,直到我們明確地調用[object release]。

2

我猜測它與字符串的內存管理有關,它可能沒有被充分保留,所以它得到清理之前,因爲它是越來越用過的。這兩種方法之間的差異被定義here

+0

感謝您的迴應和指針,Stefan。 – Khayrattee 2012-07-19 06:13:01

相關問題