【发布时间】:2011-12-04 19:30:30
【问题描述】:
这是对前面两个问题的补充。我正在使用 heapshots 来检查我的内存在提交到应用商店之前的表现,我发现每次用户完成程序循环时它都会增加 3-5KB。我回到绘图板上,注释掉程序的大部分内容,然后慢慢将这些部分重新上线。我能够将其范围缩小到我认为是问题的核心。
我会注意:我转换为 ARC 后仍然遇到同样的问题。这里(我相信)是相关的代码区域。
行类:
@interface Row : NSObject {
int rowID;
NSString *rowProblem;
NSString *rowAnswer;
int rowTimes_Right;
int rowTimes_Wrong;
Boolean marked;
}
@property (nonatomic) int rowID;
@property (nonatomic, copy) NSString *rowProblem;
@property (nonatomic, copy) NSString *rowAnswer;
@property (nonatomic) int rowTimes_Wrong;
@property (nonatomic) int rowTimes_Right;
@property (nonatomic) Boolean marked;
数据库函数(获取一行):
-(Row *) getRow {
Row *holder = [[[Row alloc] init] autorelease];
//Pick a random problem to give to the User
int randomrow = (arc4random() % [self getNumberOfRows]) + 1;
NSString *querysql = [NSString stringWithFormat:@"SELECT * FROM problems WHERE id = %d", randomrow];
const char *sql = [querysql UTF8String];
sqlite3_stmt *statement;
//Execute the Query
if (sqlite3_prepare_v2(wordsDB, sql, -1, &statement, NULL) == SQLITE_OK)
{
while (sqlite3_step(statement) == SQLITE_ROW)
{
char *problem = (char *)sqlite3_column_text(statement, 1);
char *answer = (char *)sqlite3_column_text(statement, 2);
holder.rowID = sqlite3_column_int(statement, 0);
holder.rowProblem = [NSString stringWithUTF8String:problem];
holder.rowAnswer = [NSString stringWithUTF8String:answer];
holder.rowTimes_Right = sqlite3_column_int(statement, 3);
holder.rowTimes_Wrong = sqlite3_column_int(statement, 4);
holder.marked = sqlite3_column_int(statement, 5);
}
sqlite3_finalize(statement);
}
else
{
NSLog(@"SQL Error Message: %s", sqlite3_errmsg(wordsDB));
}
return holder;
}
在视图中将它们捆绑在一起:
-(void)setToWord{
[currentRow release];
currentRow = [[dataB getRow] retain];
[problemLabel setText:currentRow.rowProblem];
[definitionLabel setText:currentRow.rowAnswer];
}
任何想法将不胜感激。
【问题讨论】:
-
肯定 heapshot 会准确地告诉你什么,什么时候增加?
-
@hooleyhoop 确实如此,我在之前的问题中询问了具体部分(包括发布调用堆栈),但没有人能破译它。
标签: ios class memory-management