我是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;
}
}
答案 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
,其中每个键都是页面(页面的编号或您喜欢的任何内容),每个值都是数据(dataA
,dataB
等等)。通过它,您可以避免每次下载数据。也许你也可以设置这个缓存的限制(例如5个数据)以防止内存问题。
希望它有所帮助。