2011-11-01 25 views
0

對於程序下面我得到在線分配的對象的以下無錯誤 潛在泄漏50. 線50個指向此line-- self.receivedData = [[NSMutableData數據]保留]; 我試圖在此語句後釋放receiveData,但是這給了我一個錯誤「object sent autorelease too much times。」我不知道我是否按照正確的方式去做。請幫忙!Objective-C的對象的泄漏誤差

- (void)viewDidLoad { 

     NSURLRequest *theRequest = 
     [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://{your ip}:8080/activiti-rest/service/process-definitions?start=0&size=10&sort=id&order=asc"]       cachePolicy:NSURLRequestReloadIgnoringLocalCacheData 
        timeoutInterval:10.0]; 

     NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self]; 

     if (theConnection) {  

      self.receivedData = [[NSMutableData data] retain]; 

     } else { 


      UIAlertView *connectFailMessage = [[UIAlertView alloc] initWithTitle:@"NSURLConnection " message:@"Failed in viewDidLoad" delegate: self cancelButtonTitle:@"Ok" otherButtonTitles: nil]; 
      [connectFailMessage show]; 
      [connectFailMessage release]; 

     } 

     [theConnection autorelease]; 

    } 

編輯:在頭文件被宣佈爲@property(nonatomic,assign) NSMutableData *receivedData;
它的工作原理之後,我刪除了這條線[theConnection自動釋放。我把頭像文件中的assign屬性保留下來,並像你問的那樣添加了[self.receiveData release]。它之前沒有工作,因爲我保留了這一行[theConnection autorelease]。我添加了它,因爲我想知道如果我不得不也可以釋放連接對象。請你解釋爲什麼不必發佈它?它不會在代碼中的任何地方發佈,它仍然有效?

+0

receivedData如何在頭文件中聲明? –

+0

我在我的問題中編輯了它。仔細檢查一下 –

+0

不知道問題出在哪裏。需要更多的代碼。 –

回答

1

沒有看到更多的代碼,分析器可能會感到困惑。

你的平衡在哪裏?在-dealloc中?

爲什麼這個屬性不是retain在第一位?


您應該在-dealloc中釋放對象。而你仍然沒有回答爲什麼對象不是retain - 這看起來很奇怪。

+0

我發佈了didFailWithError和didFinishLoading方法中的對象 –

+0

我是首發,我正在使用http://cagt.bu.edu/w/images/8/8b/URL_Connection_example.txt這個鏈接開始。在這個他有嚴格提到在.h文件中執行相同的操作 –

+0

錯誤是因爲我沒有在分配給它之前釋放receivedData。此外,我想我錯誤地試圖釋放連接對象。我刪除了該行代碼,現在它工作。謝謝! –

1

self.receivedData指向一個屬性。該屬性很可能具有「保留」標誌集。因此,它保留給你,你明確保留在行中是無關緊要的,並導致問題。

+0

如果該屬性是「非原子的,分配」,這個答案是不對的。 – bbum

1

receivedData屬性是否在相應的頭文件中聲明爲retain?這意味着當您爲其分配一個對象時,該對象會自動發送一條retain消息。你不需要自己撥打retain

+0

該屬性被聲明爲@property(nonatomic,assign)NSMutableData * receivedData; –

+0

這不是通常的方法來聲明對象類型屬性是'assign',除非它們是代表或類似的。嘗試將該屬性切換爲「複製」或「保留」,並將呼叫移至「保留」。 – Jim

0

問題可能是您正在分配receivedData而未先釋放它。請嘗試:

[self.receivedData release]; 
self.receivedData = [[NSMutableData data] retain]; 

編輯:上述原因。receivedData被聲明爲「assign」屬性。因此,如果您先分配給它而不先釋放它,則如果receivedData先前包含保留對象,則會發生內存泄漏。你當然可以改變財產從分配到保留,但我怎麼知道他沒有一個很好的使用分配的理由呢?

+0

我試過了 - [self.receivedData release]; self.receivedData = [NSMutableData data]; 它說不是由調用者在這一點上擁有的對象的引用計數的不正確遞減 –

+0

它在我刪除此行[theConnection autorelease]後工作。 我把頭像文件中的assign屬性保留下來,並像你問的那樣添加了[self.receiveData release]。它之前沒有工作,因爲我保留了這一行[連接autorelease]。我添加了它,因爲我想知道如果我還必須發佈連接對象。請你解釋爲什麼不需要發佈它?它不會在代碼中的任何地方發佈,它仍然有效? –

+0

解釋倒票? –