【发布时间】:2011-08-10 04:25:12
【问题描述】:
我目前正在使用单例作为我的应用程序的数据存储。我基本上存储了许多从 Web 服务中提取和解析的事件,然后根据需要添加。每次我从 Web 服务发出请求时,我都会解析结果并查看项目是否已经存在。如果有,我会删除它们并添加 Web 服务提供的更新版本。
一切似乎都正常工作,直到我启动 Instruments 面板发现我的系统每次从 Web 服务加载对象时(从第二次开始)都会泄漏对象。出现问题的核心方法是这个,它位于我的 HollerStore 单例类中:
- (void)addHoller: (Holler *)h
{
//Take a holler, check to see if one like it already exists
int i = 0;
NSArray *theHollers = [NSArray arrayWithArray:allHollers];
for( Holler *th in theHollers )
{
if( [[th hollerId]isEqualToString:[h hollerId]] )
{
NSLog(@"Removing holler at index %i", i);
[allHollers removeObjectAtIndex:i];
}
i++;
}
[allHollers addObject:h];
}
快速解释:我决定将 allHollers NSMutableArray 复制到 theHollers 中,因为它是由 NSURLConnection 异步更新的。如果我直接更新它,它会导致崩溃。因此,我切换到这个模型希望解决问题,但是仪器面板告诉我我的对象正在泄漏。所有的计数都是我数据集中的项目数。
据我所知,removeObjectAtIndex 并没有有效地删除项目。很想听听其他人对三件事的看法:
- 我的分析是否正确,必须有其他东西保留添加的个别呼喊?
- 我应该使用 CoreData 还是 SQLite 来存储从 Web 服务中提取的信息?
- 您知道存储在 Singleton 中的数据应该可以使用多长时间?直到应用被杀死?
更新 我想我已经找到了来源,但是也许有人可以就正确的方法提供一些清晰的信息。我创建了一个名为 parseHoller 的方法,它采用通过 SBJSON 创建的字典对象并返回我自己的模型 (Holler)。这是最后几行:
Holler *h = [[[Holler alloc] initFromApiResponse:hollerId
creatorId:creatorId
creatorName:creatorName
creatorImageUrl:creatorImage
comments:comments
attendees:attendees
wishes:wishes
invitees:invites
createdAt:createdAt
text:text
title:title
when:when]autorelease];
//(some other autorelease stuff is here to clean up the internal method)
return h;
我想既然我要返回一个自动释放的对象,这应该没问题。你觉得这有什么问题吗?
【问题讨论】:
标签: iphone objective-c ios cocoa-touch