【问题标题】:Proper Management Of A Singleton Data Store In IOS With Web Service使用 Web 服务在 IOS 中正确管理单例数据存储
【发布时间】: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 并没有有效地删除项目。很想听听其他人对三件事的看法:

  1. 我的分析是否正确,必须有其他东西保留添加的个别呼喊?
  2. 我应该使用 CoreData 还是 SQLite 来存储从 Web 服务中提取的信息?
  3. 您知道存储在 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


    【解决方案1】:

    您是否尝试过对泄漏的对象进行保留计数?也许这可以弄清楚它何时何地被保留。 代码应该是

    [putObjectHere 保留计数];

    然后写入 NSLog

    希望它能给你一些东西

    彼得

    【讨论】:

    • 是的......这就是我正在做的事情......我有一种感觉,我知道问题出在哪里,但我似乎无法解决它。也许你能帮忙?我通过 Web 服务提取内容,然后将其发送到我自己的名为“parseHoller”的方法,该方法在解析 JSON 后返回一个单独的 Holler。我将在上面发布最后几行
    • 这个答案绝对是完全错误的。 retainCount 在任何情况下都不应该用于内存调试和泄漏检测。它不会返回你认为它会返回的东西!请参阅 Dave DeLong 的出色回答,了解原因:stackoverflow.com/questions/4636146/when-to-use-retaincount
    • 老实说……一个人的回答很快被这个社区接受为事实,这很荒谬。我用它来追踪问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-31
    • 2011-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多