2011-10-17 62 views
7

我有一個使用NSOperationQueue在後臺下載圖像的項目。它一直在使用IOS 4.3的設備。但是,如果我使用基本sdk 4.3或5構建應用程序,並使用IOS5在設備上運行應用程序,則應用程序會崩潰。當應用程序啓動時,它會將NSOperation對象添加到隊列中以下載圖像。如果在兩者之間我按後退按鈕,我取消NSOperation和崩潰和控制檯下面的跟蹤顯示:NSOperationQueue不能在IOS5中工作

 
#0 0x004727b7 in ____NSOQSchedule_block_invoke_0() 
#1 0x026a5618 in _dispatch_call_block_and_release() 
#2 0x026a7a10 in _dispatch_worker_thread2() 
#3 0x974bb781 in _pthread_wqthread() 
#4 0x974bb5c6 in start_wqthread() 

並打印「ResourceLoadOperation isFinished = YES,而不由隊列它是正在啓動」 如果我評論取消方法調用,應用程序不會崩潰。 IOS5上的NSOperation更改是否有更新?

+0

我有同樣的問題。正如你所說,評論NSOperation對象的發佈會產生訣竅,但我不太確定在這種情況下內存管理是否正確... –

+0

是的,只是評論取消方法在內存管理方面可能並不正確。但是,這是IOS 5的處理速度問題,導致這個問題,因爲IOS 4.3設備的工作正常嗎? – CKT

回答

12

我反對的iOS 5,建設時有同樣的問題,我結束了創建一個名爲operationStarted標誌是NO在默認情況下,我切換到YESstart方法被調用。然後在我的finish方法(我生成KVO通知)中,我檢查了標誌的值,然後再觸發通知。

標誌的定義是這樣的:

@property (nonatomic, assign, getter=isOperationStarted) BOOL operationStarted; 

start方法:

- (void)start { 
    [self setOperationStarted:YES]; 
    ... 
} 

finish方法,當操作完成,這被稱爲或取消:

- (void)finish {  
    if (![self isOperationStarted]) return; 

    [self willChangeValueForKey:@"isExecuting"]; 
    executing = NO; 
    [self didChangeValueForKey:@"isExecuting"]; 

    [self willChangeValueForKey:@"isFinished"]; 
    finished = YES; 
    [self didChangeValueForKey:@"isFinished"]; 
} 

這最終爲我解決了這個問題。希望它可以幫助別人。

+0

我很好奇,爲什麼你甚至需要operationStarted屬性,當你已經有執行同樣的目的? –

相關問題