Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/44.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 使用Web服务正确管理IOS中的单例数据存储_Iphone_Objective C_Ios_Cocoa Touch - Fatal编程技术网

Iphone 使用Web服务正确管理IOS中的单例数据存储

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 {

我目前正在使用单例作为我的应用程序的数据存储。我基本上存储了大量从web服务中提取和解析的事件,然后根据需要添加这些事件。每次我从web服务发出请求时,我都会解析结果并查看这些项是否已经存在。如果有,我将删除它们并添加web服务提供的更新版本

一切似乎都正常工作,直到我启动仪器面板,发现我的系统从第二次从web服务加载对象时都在泄漏对象。出现问题的核心方法是这个,它位于我的HollerStore singleton类中:

- (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。我会把最后几行贴在上面。这个答案是完全错误的。在任何情况下,都不应将重新计数用于内存调试和泄漏检测。它不会返回你认为它正在返回的东西!请看戴夫·德隆的绝妙答案:我必须诚实。。。一个人的回答很快被这个社区接受为事实,这是荒谬的。我用它来追踪问题。