2010-04-11 107 views
1

我開始處理NSOperations和(像平時一樣併發)我正在觀察奇怪的行爲。 在我的課堂我有一個實例變量:消息發送到從未被釋放的釋放實例

NSMutableArray *postResultsArray; 

當UI一個按鈕被按下我初始化數組:

postResultsArray = [NSMutableArray array]; 

和設置操作(與依賴關係一起)。

在我創建一個自定義對象,並嘗試添加到陣列的操作:

PostResult *result = [[PostResult alloc] initWithServiceName:@"Sth" andResult:someResult]; 
[self.postResultsArray addObject:result]; 

,並同時加入我得到:

- [CFArray挽留]:消息發送到釋放實例0x3b40c30

這是奇怪的,因爲我不在我的代碼中任何地方釋放數組(我做過,但是當問題開始出現時,我評論了所有的發佈確保他們不是這種情況)。我也曾經有@synchronized節如下:

PostResult *result = [[PostResult alloc] initWithServiceName:@"Sth" andResult:someResult]; 
    @synchronized (self.postResultsArray) { 
     [self.postResultsArray addObject:result]; 
    } 

但問題是相同的(但是,錯誤是爲同步操作)。

任何想法我可能做錯了什麼?

回答

2
postResultsArray = [NSMutableArray array]; 

[NSMutableArray array]是其等同於一個[[[NSMutableArray alloc] init] autorelease]方法無限便捷。所以這裏有一個隱含的(自動)發佈。既然你要保持它,你必須使用這3個變化之一:

  1. postResultsArray = [[NSMutableArray array] retain]; 
    
  2. postResultsArray = [[NSMutableArray alloc] init]; 
    
  3. 利用以下事實:一個setter應該保留新值(如果你聲明爲@property(retain)):

    self.postResultsArray = [NSMutableArray array]; 
    
+0

是的,就是這樣。很高興知道。非常感謝! – Jakub 2010-04-11 13:12:11

相關問題