2013-01-12 78 views
1

我使用ARC。 我發現內存不斷增加。ios arc UILabel.text內存不斷增加

在.h文件中

@property (weak, nonatomic) IBOutlet UILabel* contentALabel; 
@property (weak, nonatomic) IBOutlet UILabel* contentBLabel; 

在.m文件

-(void)refreshContent:(NSInteger) itemID 
{ 
    sqlite3 *database; 

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *docsPath = [paths objectAtIndex:0]; 
    NSString* databasePath = [docsPath stringByAppendingPathComponent: @"Database.sqlite"]; 
    if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) { 

     NSString *sql = [NSString stringWithFormat:@"select contentA,contentB from tableA where itemID = %d ",itemID,nil]; 

     char *sqlStatement = (char *)[sql cStringUsingEncoding:NSASCIIStringEncoding]; 
     sqlite3_stmt *compiledStatement; 

     if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) { 

      while(sqlite3_step(compiledStatement) == SQLITE_ROW) { 

       NSString *contentA = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 0)]; 
       NSString *contentB = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 1)]; 

       contentALabel.text = contentA; 
       contentBLabel.text = contentB; 
      } 
     } 

     sqlite3_finalize(compiledStatement); 
    } 
    sqlite3_close(database); 
} 

我不斷地調用這個函數,我發現我的內存增加以及在 '個人資料' 窗口「生活字節'欄。

,但如果我評論

contentALabel.text = contentA; 
contentBLabel.text = contentB; 

內存將不再增加了。

'Label.text'有什麼問題?

+0

'label.text'沒有問題,只是它保留了對'NSString'的強引用(但是它應該在設置新值時釋放先前的值)。您是否可能創建新的'contentALabel'和'contentBLabel'對象,而不對舊的'removeFromSuperview'進行操作? – Rob

+0

永遠不會創造新的。 – lostin2010

+0

我遇到了同樣的問題。在這裏描述:http://stackoverflow.com/questions/16495240/if-uilabel-text-different-chinese-strings-memory-leak –

回答

0

底線,將text屬性設置爲UILabel不能解釋此行爲。我傾向於通讀涵蓋here的建議電池。特別是,查找泄漏,如果您沒有找到任何泄漏,請使用分配工具來識別正在創建的內容(顯然未發佈)。我還會放入一個斷點,然後在調試器中輸入「po [[UIWindow keyWindow] recursiveDescription]」,並確保沒有將額外的視圖/控件添加到窗口層次結構中。

我知道這不會是一個令人滿意的答案,但是你只需要花一點時間在樂器上尋找漏洞,如果不是很明顯,只需確定明顯的分配沒有得到釋放。