2011-01-08 70 views
0

我有創建對象,其然後被傳遞到另一對象的方法在另一個線程,像這樣的物體的方法,包括:自動釋放物體

MyClass* myClass = [[MyClass alloc] init]; 
[anotherClass performSelectorOnMainThread:@selector(method) withObject:myClass waitUntilDone:NO]; 

在方法中,我立即保留該對象,假設它將以某種方式由創建者發佈。我的問題是:我如何讓MyClass正確釋放該對象?這是正確的方法嗎?

我的解決方案是在方法中手動釋放對象。無論如何,我發現泄漏分析儀仍然認爲這是泄漏,似乎不是Apple推薦的,因爲所有者有責任釋放該物體。

你能解釋一下處理這種情況的正確方法嗎?謝謝!

+0

哎呀,對不起,我忘了一個重要的元素:執行我報告的指令的線程不是可可線程。我使用POSIX線程創建它。 – 2011-01-08 10:30:59

+0

Cocoa線程和POSIX線程沒有區別。但請確保您在線程的開頭創建一個自動釋放池。 – Yuji 2011-01-08 12:24:08

+0

我讀過它也有必要創建至少一個NSThread以便能夠使用NSAutoreleasePools。 – 2011-01-08 14:13:18

回答

9

我不完全理解你想達到什麼樣的,但一般:

你不應該擔心誰以及何時釋放/重新分配的對象。相反,只要在(你的單一對象或方法)開始需要它並釋放它時停止需要它(或自動釋放它,在這種情況下它將在線程上釋放你稱之爲autorelease)。

這正是performSelectorOnMainThread:withObject:waitUntilDone:的工作方式。來自documentation

此方法保留接收方和arg參數,直到執行選擇器。

它保留它們,而它需要它們來完成它的工作。

總之,創建該對象,並把它們發送到另一個線程應該是mehod:

MyClass* myClass = [[MyClass alloc] init]; // retained, will need it for performSelector 
[anotherClass performSelectorOnMainThread:@selector(method) withObject:myClass waitUntilDone:NO]; 
[myClass release]; // no longer needing it. 

MyClass* myClass = [[[MyClass alloc] init] autorelease]; // will be released automatically, but guaranteed to be retained until this method returns 
[anotherClass performSelectorOnMainThread:@selector(method) withObject:myClass waitUntilDone:NO]; 

你現在的方法是內存泄露

的接收方法:

  • 如果它使用該對象僅在內部,不具有保留它,因爲performSelector確實「直到它被執行後」(該方法返回)。
  • 如果它稍後需要它,它應該被分配給一個保留它的屬性。
0

你提的問題是很難理解,因爲你談論這個對象,該對象,另一個對象,並使用無意義的名稱,像MyClass的anotherClass方法。目前還不清楚你打算髮布哪一個對象,哪一個被報告爲泄露對象。

無論如何,多線程不會爲引用計數添加任何特殊的複雜性。當然,您的兩個對象myClass其他類不是短命的對象。因此,如果您使用autorelease,請確保在執行完所有自動釋放後參考計數器不會變爲0。

這是完全沒有問題的方法釋放或者myClass的anotherClass或兩者兼而有之。

你不會顯示很多代碼。但你顯示的是好的。