[英]Memory leaks in iphone application
嗨,大家好! 我是iPhone开发的新手。 我的内存泄漏有问题。 我有这样的代码。
do {
int s = sqlite3_step(statement);
switch (s) {
case SQLITE_ROW:{
Article *a = [[[Article alloc] init] autorelease];
for (int i = 0; i < columnCount; i++) {
const char *columnName = sqlite3_column_name(statement, i);
if(strncmp(columnName, "title", strlen("title")) == 0){
const char* colStr = (char*)sqlite3_column_text(statement, i);
if(colStr != NULL)
a.title = [[[NSString alloc] initWithCString: colStr encoding:NSUTF8StringEncoding] autorelease];
continue;
}
if(strncmp(columnName, "author", strlen("author")) == 0){
const char* colStr = (char*)sqlite3_column_text(statement, i);
if(colStr != NULL)
a.author = [[[NSString alloc] initWithCString:colStr encoding:NSUTF8StringEncoding] autorelease];
continue;
}
if(strncmp(columnName, "description", strlen("description")) == 0){
const char* colStr = (char*)sqlite3_column_text(statement, i);
if(colStr != NULL)
a.description = [[[NSString alloc] initWithCString:colStr encoding:NSUTF8StringEncoding] autorelease];
continue;
}
if(strncmp(columnName, "link", strlen("link")) == 0){
const char* colStr = (char*)sqlite3_column_text(statement, i);
if (colStr)
a.link = [[[NSString alloc] initWithCString:colStr encoding:NSUTF8StringEncoding] autorelease];
continue;
}
if(strncmp(columnName, "imageUrl", strlen("imageUrl")) == 0){
const char* colStr = (char*)sqlite3_column_text(statement, i);
if (colStr)
a.imageUrl = [[[NSString alloc] initWithCString:colStr encoding:NSUTF8StringEncoding] autorelease];
continue;
}
if(strncmp(columnName, "pubDate", strlen("pubDate")) == 0){
const char* colStr = (char*)sqlite3_column_text(statement, i);
if(colStr)
a.pubDate = [[[NSString alloc] initWithCString:colStr encoding:NSUTF8StringEncoding] autorelease];
continue;
}
}
[array insertObject:a atIndex:0];
}
break;
case SQLITE_DONE:
sqlite3_finalize(statement);
dataForReadingAvailable = NO;
break;
default:{
NSLog(@"getArticlesForFeed:sqlite3_step failed.Error:%s",sqlErrMsg);
return nil;
}
break;
}
}while(dataForReadingAvailable);
Xcode的工具显示,当我分配了对象并对其进行初始化时,我有泄漏内存。 但是为什么会这样。 所有对象都是自动释放的,因此我认为不会出现这种情况。 谢谢。
我认为也许您在某处用新指针覆盖了分配的内存。
我会取代
Article *a = [[[Article alloc] init] autorelease];
与
Article *a = [[Article alloc] init];
//some code
[a release]; //when you don't need it anymore
过多使用自动释放不是一个好习惯。 万一有很多对象,它甚至可能减慢您的应用程序的速度。 和像
a.title = [[[NSString alloc] initWithCString: colStr encoding:NSUTF8StringEncoding] autorelease];
我将替换为
a.title = [NSString stringWithCString:colStr encoding:NSUTF8StringEncoding];
在这种情况下,您还依赖于自动释放池,但这要简单得多。
编辑:的确,您的“文章”分配处于do-while循环中。 在字符串[array insertObject:a atIndex:0]中; 您的aray保留了对象,并且您不再需要它,但是您依赖于自动释放。 分析器(或使用的工具)看到的是,您将分配放置在循环的主体中,而没有在每次迭代后释放它。 这样,在循环的第二次迭代中,您将覆盖“ a”对象,从而丢失旧指针并以这种方式泄漏内存(由于“ a”被覆盖,因此池找不到该指针)。 即使您只通过一次循环,分析仪也不会在意并发出警告。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.