1

我使用的核心運動的推動處理程序加速更新:崩潰與塊和核心運動

CMAccelerometerHandler accelerometerHandler =^(CMAccelerometerData *accelerometerData, NSError *error) { 
    // handle update 
}; 

[motionManager startAccelerometerUpdatesToQueue:[NSOperationQueue mainQueue] 
            withHandler:[[accelerometerHandler copy] autorelease]]; 

此代碼崩潰。如果我根本不復制塊,我會在暫停/恢復時間間歇性地崩潰。如果我刪除autorelease它工作正常,但我認爲這會產生泄漏。

我也嘗試將塊分配給伊娃,並在[motionManager stopAccelerometerUpdates]後發佈。崩潰以及。

怎麼回事?我一直以爲我必須平衡任何copy/retainrelease/autorelease

參見:Copying blocks (ie: copying them to instance variables) in Objective-C

回答

1

這裏的問題是在塊所有權。當你認爲塊體實際上只是對象時,它應該變得更清晰,這一切都需要工作。你需要將這個塊複製到堆中,但是你需要像對待你擁有所有權的其他對象一樣對待它。當調用該塊上的副本的對象時,您應該釋放您對該塊的所有權。

+0

好吧,愚蠢的我。當我嘗試了我描述的伊娃方法時,我將塊字面賦值給了伊娃,然後調用'[motionManager startAccelerometerUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:[[accelerometerHandler copy]]''。所以當我釋放伊娃時,我實際上試圖釋放堆棧塊而不是堆塊。當然哪個崩潰。 – 2010-11-12 18:36:56

+0

這會導致問題:)塊管理有時候會有點奇怪,但是你得到它的竅門 – 2010-11-12 18:38:59