簡體   English   中英

iPhone:線程+釋放池+ [對象釋放] =“發送到已釋放實例的消息”

[英]iphone: threads + release pool + [ object release] = “message sent to deallocated instance”

我在iPhone上運行一些小代碼時遇到了麻煩。

基本上,我只是按下一個按鈕,它調用runTest ,它在后台線程上運行test方法。 這就是為什么我創建了一個自動釋放池。

如果我運行以下代碼,控制台上會顯示一條漂亮的消息:
2010-09-07 11:45:15.527 test[1312:207] *** -[CFString release]: message sent to deallocated instance 0x3d52ba0

-(void) test {
    NSAutoreleasePool *apool = [[NSAutoreleasePool alloc] init];

    NSString *xml = [[NSString alloc] initWithFormat:@"<%@>", @"msg"];
    NSLog(@"%@\n",xml);
    [xml release];

    [apool release]; // <-- this line throws the error msg  
}

- (IBAction) runTest: (id)sender
{
    [self performSelectorInBackground:@selector(test) withObject:nil];

}

我發現:如果不對后台線程(沒有自動釋放池)運行test ,只需調用[self test] ,代碼就可以正常工作。

所以,我認為問題出在線程+自動釋放池周圍,我在做什么錯? 以及我該如何解決?

PS我啟用了NSZombie標志。

NSLog可能必須向UI線程(執行主線程上的選擇器)發送一條消息,以打印序列化到控制台的內容,此時您的xml已經被釋放。

在這種情況下沒關系,但是您應該始終drain池,不要release池。

如果這就是所有代碼,那真是一個奇怪的錯誤。

我建議的第一件事是運行代碼,同時在儀器中記錄所有保留/釋放事件的同時啟用僵屍檢測。 這將為您提供有關違規對象的保留/釋放的清單。 如果仍然沒有意義,請發布結果。

您是否嘗試對對象xml -autorelease 這會將其添加到活動池apool 聲明drain比聲明-release更好-在非垃圾收集環境中它們是相同的,但是有一天Apple可能會在iPhone上實現垃圾收集。 希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM