2013-05-27 102 views
4

嗨我正在處理內存泄漏,但我不知道它是什麼問題(我沒有太多的儀器經驗,所以請原諒,如果我問一些明顯的問題) 。NSString stringwithwith內存泄漏與ARC

基本上我有兩個字符串作爲在我的類屬性,第一個將要顯示給用戶的主隊列被檢索,並且不立即需要在背景隊列中檢索到的一個:

在stringWithFormat code leak enter image description here

問題與佔位符做@「%@ ...」,因爲如果我只是把@‘測試’:

@property (nonatomic, strong) NSString *stringDefaultLocationAddress; 
@property (nonatomic, strong) NSString *stringCurrentLocationAddress; 

-(void)viewDidLoad{ 
    ... 
      dispatch_async(idQueue, ^(void) { 
      [self recuperaDireccionActualEnBackground:currentUserLocation.coordinate]; 
     }); 

} 

- (void)dealloc{ 
    [self removeObserver:self forKeyPath:@"playerProfileNeedsUpdate"]; 
    self.stringCurrentLocationAddress = nil; 
    self.stringDefaultLocationAddress = nil; 
} 

但我得到這個泄漏的儀器那時泄漏消失了,但我不知道爲什麼泄漏這一點,我想了解它。

在此先感謝。

+2

如果你只是放了'@「Test」''''''''''''''''''''''''''''''消息' - [NSString copy]'當它是可變的('NSMutableString'的子類)時產生一個副本,或者當它是不可變的時候保留('NSString'的子類)。因此,在聲明'NSString'時總是複製。複製可變字符串可確保客戶端不會遠程更改保存在屬性中的值。如果您使用的是iOS 5,則「CLGeocoder」中有地理編碼和反向地理編碼,您不需要庫。你不需要在'dealloc'中刪除變量,ARC已經釋放了這些屬性。 – Jano

+0

我感謝你@Jano的回覆,我剛剛添加了COPY消息,現在我沒有內存泄漏,謝謝你的迴應。 – Rubs

+0

我的意思是聲明:@property(nonatomic,COPY)NSString * stringDefaultLocationAddress; – Rubs

回答

3

儀器會告訴您泄漏物體的分配位置,但這可能不是泄漏的位置。您需要查看對象的保留和釋放歷史記錄(單擊地址旁邊的圓圈中的右箭頭)。您必須手動分析每個保留,將每個保留與邏輯對應的發佈相關聯,直到找到不平衡的保留。

如果您在整個代碼中使用ARC,我懷疑您錯用了__bridge_retainedCFBridgingRetain()。或者也許你已經做了一個適當的橋樑投擲到CFStringRef,但之後沒有正確做手動引用計數。

絕對用靜態分析器構建,並努力消除所引起的所有問題(或者至少向自己證實它們是誤報)。