2010-06-16 73 views
0

我寫的代碼來恢復我的應用程序的狀態,但有一個在NSMutableArray的內存泄漏。我是Xcode的新手,所以我很抱歉,如果這是我忽略的一些微不足道的東西。任何幫助表示讚賞。 LQ內存泄漏叫做從應用程序委託

AppDelegate.m 

- (void)applicationDidFinishLaunching:(UIApplication *)application { 
    [rootViewController restoreState]; 
} 

RootViewController.h 

@interface rootViewController : UIViewController { 
    NSMutableArray *offendingNSMutableArray; 
} 
@property (nonatomic, retain) NSMutableArray *offendingNSMutableArray; 

RootViewController.m 

@synthesize offendingNSMutableArray; 

- (void)restoreState { 
    // Gets an array stored in the user defaults plist 
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 
    self.offendingNSMutableArray = [[NSMutableArray alloc]  
      initWithArray:[userDefaults objectForKey:kArrayValue]]; 
} 

- (void)viewDidUnload { 
    self.offendingNSMutableArray = nil; 
} 

- (void)dealloc { 
    [offendingNSMutableArray release]; 
} 
+1

首先,你的alloc-INIT與retainCount = 1,那麼你做setOffendingNSMutableArray: - > retainCount = 2。在viewDidUnload中,您將其設置爲nil,因此retainCount = 1,並且丟失了指向數組的指針。這是你的泄漏。 – beefon 2010-06-16 14:27:08

+0

對不起,我是這個...我沒有分配初始化,並設置在與下面的代碼行同一行: self.offendingNSMutableArray = [[NSMutableArray alloc] initWithArray:[userDefaults objectForKey:kArrayValue] ]。 – 2010-06-16 14:51:52

回答

0

如果你將其設置爲viewDidUnloadnil,你有什麼打算在dealloc釋放? 你應該只是做

self.offendingNSMutableArray = nil; 
dealloc

,這對保留的性質的常用方法。

編輯:現在看到了從上面的評論。你需要autorelease在你做alloc/init的地方。物業二傳將保留。

+0

使用儀器我在alloc init行上顯示泄漏的對象:Malloc 32字節,以及alloc init行上的泄漏對象:NSCFArray。 – 2010-06-16 14:43:53

+0

有人告訴我(由著名的OBJ-C民俗在這裏),在'dealloc'調用屬性setter是一個糟糕的主意,因爲這可能會導致射擊的通知,你不希望在中期拆卸。至於內存泄漏 - 當然有一個,請參閱@ beefon的評論。 – walkytalky 2010-06-16 14:46:38

+0

@walkytalky這是什麼在這裏推薦http://developer.apple.com/mac/library/documentation/cocoa/conceptual/objectivec/articles/ocProperties.html。是的,我現在看到了泄漏,我的錯誤 – unbeli 2010-06-16 14:59:02

0

OK,所以它看起來像我加入自動釋放解決泄漏:

- (void)restoreState { 
    // Gets an array stored in the user defaults plist 
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 
    self.offendingNSMutableArray = [[[NSMutableArray alloc]  
     initWithArray:[userDefaults objectForKey:kArrayValue]] autorelease]; 
} 

但我覺得我不想因爲我在其他地方的應用參考offendingNSMutableArray使用自動釋放?

+0

二傳手將自己保留該對象。這個'autorelease'放棄你通過'alloc'得到的本地所有權。把它放在這樣一行中會使語義有點不透明 - 在一行中分配'''init'會更清楚,分配一秒,然後明確地釋放'釋放' - 但是最終結果是(幾乎)相同。 – walkytalky 2010-06-16 16:33:03