Iphone 使用Web服务正确管理IOS中的单例数据存储
我目前正在使用单例作为我的应用程序的数据存储。我基本上存储了大量从web服务中提取和解析的事件,然后根据需要添加这些事件。每次我从web服务发出请求时,我都会解析结果并查看这些项是否已经存在。如果有,我将删除它们并添加web服务提供的更新版本 一切似乎都正常工作,直到我启动仪器面板,发现我的系统从第二次从web服务加载对象时都在泄漏对象。出现问题的核心方法是这个,它位于我的HollerStore singleton类中:Iphone 使用Web服务正确管理IOS中的单例数据存储,iphone,objective-c,ios,cocoa-touch,Iphone,Objective C,Ios,Cocoa Touch,我目前正在使用单例作为我的应用程序的数据存储。我基本上存储了大量从web服务中提取和解析的事件,然后根据需要添加这些事件。每次我从web服务发出请求时,我都会解析结果并查看这些项是否已经存在。如果有,我将删除它们并添加web服务提供的更新版本 一切似乎都正常工作,直到我启动仪器面板,发现我的系统从第二次从web服务加载对象时都在泄漏对象。出现问题的核心方法是这个,它位于我的HollerStore singleton类中: - (void)addHoller: (Holler *)h {
- (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复制到Hollers中,因为它是由NSURLConnection异步更新的。如果我直接更新它,会导致崩溃。因此,我切换到这个模式,希望解决这个问题,但仪表板告诉我,我的物体正在泄漏。所有计数都是我数据集中的项目数
据我所知,removeObjectAtIndex并没有有效地删除这些项。我很想让其他人想到三件事:
我的分析是否正确,即必须有其他东西来保留添加的个别呼叫?
我应该使用CoreData还是SQLite来存储从web服务提取的信息?
您知道单例中存储的数据可以使用多长时间吗?直到应用程序被杀死?
更新
我想我已经找到了源头,不过也许有人可以提供一些正确的方法来做到这一点。我创建了一个名为parseHoller的方法,它接受通过SBJSON创建的dictionary对象并返回我自己的模型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;
我想既然我返回了一个自动释放的对象,这应该没问题。您认为这有什么问题吗?您是否尝试对泄漏的对象进行保留计数?也许这可以弄清楚它被保留的时间或地点。 代码应该是 [putObjectHere retainCount] 然后写入NSLog 希望它能给你一些东西
彼得是的。。。这就是我正在做的。。。我有一种感觉,我知道问题在哪里,但我似乎无法解决它。也许你能帮忙?我通过web服务提取内容,然后将其发送到我自己的名为parseHoller的方法,该方法通过JSON解析后返回一个单独的Holler。我会把最后几行贴在上面。这个答案是完全错误的。在任何情况下,都不应将重新计数用于内存调试和泄漏检测。它不会返回你认为它正在返回的东西!请看戴夫·德隆的绝妙答案:我必须诚实。。。一个人的回答很快被这个社区接受为事实,这是荒谬的。我用它来追踪问题。