2012-05-25 74 views
0

我瞭解iOS內存管理的另一個問題3.0+,我知道,如果我們做[varialbe發佈]將公佈保留的對象,但這樣的代碼 -內存管理時使用釋放

- (void) getPostsFromJson:(NSData *)data 
{ 
    NSError *theError = nil; 

    NSDictionary *dict = [[CJSONDeserializer deserializer] deserializeAsDictionary:data error:&theError]; 

    if (dict == nil) { 

     [SystemStatusValues getInstance].isValidJson = NO; 
     [SystemStatusValues getInstance].httpStatus = HTTP_STATUS_FAILED; 

     NSLog(@"getPostsFromJson - %@ %@", 
       [theError localizedDescription], 
       [[theError userInfo] objectForKey:NSURLErrorFailingURLStringErrorKey]); 
    } else { 

     NSArray *keys = [dict allKeys];   
     keys = [keys sortedArrayUsingFunction:keySortByInteger context:nil]; 

     self.keys = keys; 
     self.posts = dict; 
     NSLog(@"Posts : getPostsFromJson = %@", self.posts); 

     if ([keys count] < TOTAL_SECTIONS) { 

      [SystemStatusValues getInstance].isValidJson = NO; 

     } else { 

      [SystemStatusValues getInstance].isValidJson = YES; 
      if (self.nextPosts == nil) { 

      } 

     } 

     // [keys release]; 
     // [dict release]; 
     return; 
    } 
} 

你可以看到有兩個局部變量 - 鍵和字典,我是否需要在代碼結尾調用[keys release]或[dict release]?其實我做到了,但它有時會帶來壓力。那麼對於局部變量,我們不需要在它被使用後釋放它呢?

回答

2

字典和鍵都是對自動釋放對象的引用。你不應該釋放它們,這會導致你的程序終止。 You Don’t Own Objects Returned by Reference and You must not relinquish ownership of an object you do not own

那麼對於局部變量,我們不需要在它被使用後釋放它呢?如果你擁有這些物品,那麼當你不再需要物品時,你必須將它們釋放出來,如果它的局部變量或伊娃是無關緊要的。

閱讀本 - Advanced Memory Management Programming guide

0

不要放開keys陣列。因爲allKeys方法可能返回自動釋放NSArray對象。所以它將在稍後由系統發佈。

看起來好像deserializeAsDictionary也會返回一個自動發佈的NSDictionary,所以你不應該發佈它。

發佈對象只能使用alloc創建。在這種情況下,您正在使用外部方法。您需要遵循該方法,並查看該對象是否使用alloc創建。

+0

您可以放棄使用名稱以「alloc」,「new」,「copy」或「mutableCopy」開頭的方法創建的對象的所有權。 – 0x8badf00d

2

It's simple

如果頁頭,複製或 你需要釋放保留的對象。否則你不會。

所以你並不需要釋放任何鍵或字典(他們都是自動釋放)。