2011-06-02 46 views
0

我有一個解析器類是NSOperation的子類。它用於解析xml,並在解析完成時重新加載表視圖。我有一個刷新的UIBarButtonItem,用來調用解析器並再次從鏈接中解析新的xml。NS操作和重新加載解析器

-(void)refresh { 
    [self.queue cancelAllOperations]; //cancel all the current operations 
    [self.queue release]; 
    self.queue=nil; 
    self.arrayOfAllPhotos = nil; // The array to load table view 
    [self performSelectorOnMainThread:@selector(doItAgain) withObject:nil waitUntilDone:NO]; 

}

-(void)doItAgain { 
    [tableView reloadData]; 
    NSURL *url = [NSURL URLWithString:@"some url"]; 
    NSURLRequest *request = [NSURLRequest requestWithURL:url]; 
    NSURLConnection *aconnection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
    self.myConnection = aconnection; 
    [aconnection release]; 

}

不過,截至發稿刷新按鈕,應用程序崩潰,沒有消息。我如何釋放NSOperationQueue並再次開始新的分析以加載數據?

回答

1

您的內存管理已損壞。你正在違反封裝。您正在致電[self.queue release]。這是達到self並通過發佈self擁有。

如果我伸手進腹,放開你的肝臟,這可能是爲了國家的利益,但它可能會對你有害。這個概念被稱爲封裝。這個概念解釋爲here

違規封裝對於任何原因都是不利的,並且這對於self這裏是不好的。

而不僅僅是打電話self.queue = nilsetQueue:方法會釋放queue爲你當它是正確的時間(就像它爲arrayOfPhotos)。

[self.queue cancelAllOperations]; 
self.queue = nil; 
self.arrayOfAllPhotos = nil; 

退一步說,從這個問題的細節,似乎你也可以花一些時間得到MVC模式有更深的瞭解。 WWDC 2010的演講(會話標題:Model-View-Controller for iPhone OS)關於它的內容非常棒,可以找到here(您必須登錄)。

通常,將網絡與桌面視圖控制器混合是一個壞主意。

祝你好運!

+0

比爾,你的意思是2010正確!這是2011年迫在眉睫的.. – petert 2011-06-02 09:25:14

1

如果隊列被定義爲保留屬性,則這裏:

[self.queue release]; 
    self.queue=nil; 

您正在overreleasing隊列:它首先手動釋放,然後在設定器的方法,因爲隊列仍然不是nil和不同於零這將是再次發佈並設置爲零,第二次發佈會導致崩潰。調用cancelAllOperations,它的asynchoronos手術後

self.queue=nil; 
1

你應該小心:

這將是足夠的。確保所有操作最簡單的方法就是取消它:

[self.queue cancelAllOperations] 
[self.queue waitUntilAllOperationsAreFinished];