2012-02-06 43 views
0

我的代碼存在問題,對於我來說我無法弄清楚,甚至沒有以前的所有線程。 我從JSON源拉取數據並將其放入NSDictionary中,如教程和SO中所述。在分析應用程序時,我注意到由此NSDictionary引起的內存泄漏,但在此函數結束時釋放它會使應用程序崩潰。有什麼建議麼? (順便說一句:我是新來的,一般的OBJ-C和編程,所以這段代碼主要是從各種來源cherrypicked。)NSDictionary泄漏內存

- (void)fetchedData:(NSData *)responseData { 
    //parse JSON for empty return 
    if([responseData length] != 0){ 

     NSError* error = nil; 
     //Convert JSON data to Obj-C 
     NSDictionary* allShotData = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&error]; 

     NSString *player = [[allShotData objectForKey:@"player"] objectForKey:@"name"]; 
     NSString *shotDribbblePage = [allShotData objectForKey:@"url"]; 

     NSString *shotTitle = [allShotData objectForKey:@"title"]; 
     NSURL *imageURL = [NSURL URLWithString:[allShotData objectForKey:@"image_url"]]; 
     shotPageURL = [shotDribbblePage retain]; 


     //*********************** 
     // Setup a-sync loading of shot 
     //*********************** 

     NSOperationQueue *queue = [NSOperationQueue new]; 
     NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(loadImage:) object:imageURL]; 
     [queue addOperation:operation]; 
     [operation release]; 
     [queue release]; 
    } 
    else{ 
     airballCount++; 
     if (airballCount <= 20) { 
      [self getDribbbleData]; 
     } 
     else{ 
      NSLog(@"Too many airballs. Bailing out"); 
      [self showNoConnectionModal]; 
     } 
    } 
} 

回答

2

這裏:

shotPageURL = [shotDribbblePage retain]; 

你應該使用訪問者:

self.shotPageURL = shotDribbblePage; 

我應該真的強調,因爲他們做你的裁判計數FO你應該用你的訪問器無處不在你(例外:不在初始化程序和dealloc中)。正如鈹所指出的那樣,如果沒有訪問器,你可以手動進行參考計數。這需要基本形式:

[shotPageURL release]; 
shotPageURL = [shotDribbblePage retain]; 

如果它有泄漏返回字典的內容,那麼它的時候(過保留)讀你如何應用/引用的內容。

如果你在併發上下文中使用你的類,那麼你通常需要一個鎖。

如果您正在加載UIImage或以其他方式與來自輔助線程的UIKit對象進行交互 - 這不太好。

+1

或'[shotPageURL發佈]; shotPageURL = nil; shotPageURL = [shotDribbblePage retain];'如果沒有屬性。 – beryllium 2012-02-06 09:27:46

+0

@beryllium指出 - 謝謝。 – justin 2012-02-06 09:34:02

+0

謝謝賈斯汀,這確實是問題之一,但事實證明這不是唯一的問題。一個人提到複製shotDribbblePage添加副本,然後手動釋放它。這顯然是因爲紅色的秒殺不再出現。 – 2012-02-06 09:52:06