Ios tableview内存管理-单例类

Ios tableview内存管理-单例类,ios,networking,singleton,paging,tableview,Ios,Networking,Singleton,Paging,Tableview,我是ios编程新手,所以我有个问题。我正在开发一个应用程序,它将继续在internet上加载数据,这是分页数据,因此当用户导航到下一页时,它将在internet上加载该页的数据。我使用了一个singleton类,它工作得很好,但我有一个问题- 当第一页到达时,我将其保存到self.posts变量,如-self.posts=dataA,当用户转到下一页时,它将self.posts更改为dataB,如self.posts=dataB。我的问题是,数据是由iOS自动发布,还是不是?如果不是,如何处理这

我是ios编程新手,所以我有个问题。我正在开发一个应用程序,它将继续在internet上加载数据,这是分页数据,因此当用户导航到下一页时,它将在internet上加载该页的数据。我使用了一个singleton类,它工作得很好,但我有一个问题-

当第一页到达时,我将其保存到self.posts变量,如-
self.posts=dataA
,当用户转到下一页时,它将self.posts更改为dataB,如
self.posts=dataB
。我的问题是,数据是由iOS自动发布,还是不是?如果不是,如何处理这些垃圾内存?你知道它会一页一页地加载数据,如果加载的页面太多,可能会有问题……谢谢

对不起,忘了告诉你们,这个应用程序是针对iOS 3.x+的,所以我想ARC不可用。检查这个函数,它将在HTTP连接完成后被调用,并将JSON解析为NSDictionary,每次它将为一个页面加载大约5个帖子,下一个页面是另外5个帖子,所以您知道,如果是另一个新的HTTP网络,self.posts会发生更改

- (void) getNextPostsFromJson:(NSData *)data
{
    NSError *theError = nil;

    NSDictionary *dict = [[CJSONDeserializer deserializer] deserializeAsDictionary:data error:&theError];

    if (dict == nil) {
        isValidJson = NO;
        httpStatus = HTTP_STATUS_FAILED;

        NSLog(@"json con - %@ %@",
              [theError localizedDescription],
              [[theError userInfo] objectForKey:NSURLErrorFailingURLStringErrorKey]);   
    } else {

        NSArray *keys = [dict allKeys];        

        if ([keys count] >= TOTAL_SECTIONS) {
            self.posts = dict;
        } else {
            self.posts = nil;
        }

        NSLog(@"posts = %@", self.posts);
        return;
    }
}

如果您使用ARC(自动参考计数)和任何其他指针(
\u strong
)指向它,它将自动释放。所以不要担心:)

只要您除了设置属性之外没有手动保留dataA,您就不需要担心它。使用点表示法将导致作为属性集的对象被保留,并在被其他对象替换后再次释放


编辑:您添加的代码示例对我来说似乎很好…

烤面包机的建议是正确的

如果您使用如下属性

@property (nonatomic, retain) NSDictionary* posts;
当你这样做的时候

self.posts = dataB;
旧值引用对象将为您释放

编译器使用
@synthesis
指令合成的setter如下所示(此处为伪代码):

给你一个简单的建议。

如果您这样做,则会丢失
dataA
。因此,当您回来时,您需要再次执行下载。那么,你认为下载数据的缓存是什么呢?例如,创建一个
NSMutableDictionary
,其中每个键都是页面(页面编号或您喜欢的任何内容),每个值都是数据(
dataA
dataB
等等)。通过它,您可以避免每次下载数据。也许您还可以为这个缓存设置一个限制(比如5个数据),以防止内存问题


希望能有所帮助。

您在项目中使用ARC吗?请提供一些代码或给我们一些有关
self.posts
dataA
(或
dataB
)的详细信息。感谢您如此快速的回答,我实际上可以跨iOS 3.0+工作,我听说iOS 3.x上没有APC,还有什么建议吗?谢谢你的解释,非常感谢!我会选择Flex_瘾君子的答案,你的答案很棒,只是我认为Flex_瘾君子的答案更详细,所以可能对其他人更有帮助。@Tom,不客气。如果您觉得缓存建议有用,也可以向上投票。干杯
- (void)setPosts:(NSDictionary*)newPosts
{
    if(newDict != posts) {

        [newPosts retain]; // retain the new value
        [posts release]; // release the old value
        posts = newPosts; // now posts reference the new value
    }
}