我是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;
}
}
烤面包机建议是对的。
如果您使用如下属性。
@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 个数据)以防止内存问题。
希望有帮助。
如果使用ARC(自动引用计数)并且任何其他指针(
_strong
)指向它,它会自动释放。所以不用担心:)
只要你除了设置属性之外没有手动保留dataA,你就不需要担心它。使用点表示法将导致设置为属性的对象被保留,并在被其他对象替换后再次释放。
编辑:您添加的代码示例对我来说似乎很好......