tableview内存管理 - 单例类

时间:2012-05-24 12:33:29

标签: ios networking singleton paging tableview

我是ios编程的新手,所以我有一个问题。我正在开发一个应用程序,将继续在互联网上加载数据,这是分页数据,因此当用户导航到下一页时,它将在互联网上加载页面数据。我使用单例类来制作它,它工作正常,但我有一个问题 -

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

很抱歉忘了告诉你们,该应用适用于iOS 3.x +,所以我猜ARC不可用。检查此函数,它将在HTTP连接完成后调用,并将JSON解析为NSDictionary,每次它将为一个页面加载大约5个帖子,而下一页是另外5个帖子,所以你知道,self.posts已更改如果它是另一个新的HTTP网络。

- (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;
    }
}

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

只要您在设置属性时手动不保留dataA,您就不必担心它。使用点符号将导致保留对象集作为属性,并在被其他对象替换后再次释放。

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

答案 2 :(得分:0)

烤面包机建议是对的。

如果您使用以下属性。

@property (nonatomic, retain) NSDictionary* posts;

当你做

self.posts = dataB;

为您释放旧的引用对象。

编译器使用@synthesize指令合成的setter看起来像这样(这里是伪代码):

- (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
    }
}

一个简单的建议。

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

希望它有所帮助。