2013-01-20 34 views
1

我使用的是ARC,每次我都在下面調用代碼。我發現「實時字節」每次都會增加一點。這裏必須有內存泄漏。ARC,stringWithUTF8String內存穩步增加「Live Bytes」

char* example = (char *)sqlite3_column_text(compiledStatement, 1);         

label.text = [NSString stringWithUTF8String:example]; 

但如果我在下面的方式做,內存將永遠保持穩定的一個字節數。但label.text內容是不準確的話,我想,這是腐敗像 「&#( &(* @#)#@ $」。

char* example = (char *)sqlite3_column_text(compiledStatement, 1);         

label.text = [NSString stringWithFormat:@"%s",example]; 

enter image description here

enter image description here

回答

0

嘗試用這種方法讀取字符串,看看是否有任何變化發生。

char* example = (char *)sqlite3_column_text(compiledStatement, 1);         

label.text = [NSString stringWithFormat:@"%@",example]; 
0

我有完全相同的問題。原來是因爲stringWithUTF8String在內部使用autorelease,所以內存直到封閉autorelease池塊(在我的情況下是整個應用程序)結束時才釋放。

作爲一個實驗,試試這個:

@autoreleasepool { 
    char* example = (char *)sqlite3_column_text(compiledStatement, 1);         
    label.text = [NSString stringWithUTF8String:example]; 
} 

,你應該看到現場字節停止生長。

1

老問題,但還是實際:

很可能是「自動釋放問題」作爲@jlegakis已經指出。

我只是想提出一個不同的方法來獲得從類工廠方法去掉自動釋放返回對象的[NSFoo fooWith...]

相反,如果使用模式

NSFoo* foo = [[NSFoo alloc] initWith...] 

創建的對象不是自動釋放。所以,如果你寫:

char* example = (char *)sqlite3_column_text(compiledStatement, 1); 
label.text = [[NSString alloc] initWithUTF8String:example]; 

「autorelease問題」應該消失。