tableview内存管理-单例类

问题描述 投票:0回答:3

我是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;
    }
}
ios network-programming pagination singleton tableview
3个回答
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
,其中每个键是页面(页码或您喜欢的任何内容),每个值是数据(
dataA
dataB
等)。通过它,您可以避免每次都下载数据。也许您还可以为此缓存设置一个限制(例如 5 个数据)以防止内存问题。

希望有帮助。


0
投票

如果使用ARC(自动引用计数)并且任何其他指针(

_strong
)指向它,它会自动释放。所以不用担心:)


0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.