Ios tableview内存管理-单例类
我是ios编程新手,所以我有个问题。我正在开发一个应用程序,它将继续在internet上加载数据,这是分页数据,因此当用户导航到下一页时,它将在internet上加载该页的数据。我使用了一个singleton类,它工作得很好,但我有一个问题- 当第一页到达时,我将其保存到self.posts变量,如-Ios tableview内存管理-单例类,ios,networking,singleton,paging,tableview,Ios,Networking,Singleton,Paging,Tableview,我是ios编程新手,所以我有个问题。我正在开发一个应用程序,它将继续在internet上加载数据,这是分页数据,因此当用户导航到下一页时,它将在internet上加载该页的数据。我使用了一个singleton类,它工作得很好,但我有一个问题- 当第一页到达时,我将其保存到self.posts变量,如-self.posts=dataA,当用户转到下一页时,它将self.posts更改为dataB,如self.posts=dataB。我的问题是,数据是由iOS自动发布,还是不是?如果不是,如何处理这
self.posts=dataA
,当用户转到下一页时,它将self.posts更改为dataB,如self.posts=dataB
。我的问题是,数据是由iOS自动发布,还是不是?如果不是,如何处理这些垃圾内存?你知道它会一页一页地加载数据,如果加载的页面太多,可能会有问题……谢谢
对不起,忘了告诉你们,这个应用程序是针对iOS 3.x+的,所以我想ARC不可用。检查这个函数,它将在HTTP连接完成后被调用,并将JSON解析为NSDictionary,每次它将为一个页面加载大约5个帖子,下一个页面是另外5个帖子,所以您知道,如果是另一个新的HTTP网络,self.posts会发生更改
- (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;
}
}
如果您使用ARC(自动参考计数)和任何其他指针(
\u strong
)指向它,它将自动释放。所以不要担心:)只要您除了设置属性之外没有手动保留dataA,您就不需要担心它。使用点表示法将导致作为属性集的对象被保留,并在被其他对象替换后再次释放
编辑:您添加的代码示例对我来说似乎很好…烤面包机的建议是正确的 如果您使用如下属性
@property (nonatomic, retain) NSDictionary* posts;
当你这样做的时候
self.posts = dataB;
旧值引用对象将为您释放
编译器使用@synthesis
指令合成的setter如下所示(此处为伪代码):
给你一个简单的建议。
如果您这样做,则会丢失dataA
。因此,当您回来时,您需要再次执行下载。那么,你认为下载数据的缓存是什么呢?例如,创建一个NSMutableDictionary
,其中每个键都是页面(页面编号或您喜欢的任何内容),每个值都是数据(dataA
,dataB
等等)。通过它,您可以避免每次下载数据。也许您还可以为这个缓存设置一个限制(比如5个数据),以防止内存问题
希望能有所帮助。您在项目中使用ARC吗?请提供一些代码或给我们一些有关
self.posts
和dataA
(或dataB
)的详细信息。感谢您如此快速的回答,我实际上可以跨iOS 3.0+工作,我听说iOS 3.x上没有APC,还有什么建议吗?谢谢你的解释,非常感谢!我会选择Flex_瘾君子的答案,你的答案很棒,只是我认为Flex_瘾君子的答案更详细,所以可能对其他人更有帮助。@Tom,不客气。如果您觉得缓存建议有用,也可以向上投票。干杯
- (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
}
}