[英]tableview memory management - singleton class
我是ios編程的新手,所以我有一個問題。 我正在開發一個應用程序,它將繼續在Internet上加載數據,這是頁面數據,因此當用戶導航到下一頁時,它將在Internet上加載該頁面的數據。 我使用單例類來制作它,效果很好,但是我有一個問題-
當第一頁到達時,我將其保存到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;
}
}
如果您使用ARC(自動參考計數),並且任何其他指針( _strong
)指向它,它將自動釋放。 所以不用擔心:)
除了設置屬性外,只要您沒有手動保留dataA,就不必擔心。 使用點符號會導致設置為屬性的對象被其他對象替換后保留並再次釋放。
編輯:您添加的代碼示例對我來說似乎很好...
烤面包機的建議是正確的。
如果您使用如下所示的屬性。
@property (nonatomic, retain) NSDictionary* posts;
當你做
self.posts = dataB;
已為您釋放舊值引用的對象。
編譯器使用@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
其中每個關鍵是頁面(頁面或任何你喜歡的號碼),並且每個值數據( dataA
, dataB
等)。 通過它,您可以避免每次都下載數據。 也許您也可以為此緩存設置一個限制(例如5個數據),以防止出現內存問題。
希望能幫助到你。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.