2013-01-12 49 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]”,并确保没有将额外的视图/控件添加到窗口层次结构中。

我知道这不会是一个令人满意的答案,但是你只需要花一点时间在乐器上寻找漏洞,如果不是很明显,只需确定明显的分配没有得到释放。