0

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

当第一页到达时,我将它保存到 self.posts 变量中,例如 - self.posts = dataA,当用户转到下一页时,它会将 self.posts 更改为 dataB,例如self.posts = dataB。我的问题是,数据A是否会由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;
    }
}
4

3 回答 3

0

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

于 2012-05-24T12:35:21.803 回答
0

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

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

于 2012-05-24T12:45:01.743 回答
0

烤面包机的建议是正确的。

如果您使用如下属性。

@property (nonatomic, retain) NSDictionary* posts;

当你这样做时

self.posts = dataB;

旧值引用对象为您释放。

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

- (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 个数据)以防止内存问题。

希望能帮助到你。

于 2012-05-24T13:03:11.283 回答