2010-05-19 71 views
6

我已經推出使用performSelector延遲的線程,但用戶仍然有能力擊中當前視圖的後退按鈕,導致dealloc被調用。當發生這種情況時,我的線程似乎仍然被調用,導致我的應用程序崩潰,因爲線程試圖寫入的屬性已被釋放。爲了解決這個問題,我想叫cancelPreviousPerformRequestsWithTarget取消以前的請求,但它似乎並不奏效。以下是一些代碼片段。cancelPreviousPerformRequestWithTarget不取消我之前延遲的線程開始與performSelector

- (void) viewDidLoad { 
    [self performSelector:@selector(myStopUpdatingLocation) withObject:nil afterDelay:6]; 
} 

- (void)viewWillDisappear:(BOOL)animated { 
     [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(myStopUpdatingLocation) object:nil]; 
    } 

我在做什麼不正確嗎?方法myStopUpdatingLocation在我稱之爲執行請求的相同類中定義。

更多背景。我試圖實現的功能是查找用戶位置,在該位置周圍的某些位置搜索谷歌並在地圖上顯示多個註釋。在viewDidLoad我開始與CLLocationManager更新的位置。我已經建立超時6秒後,如果我沒有在超時時間內讓我期望的準確度和我使用的是performSelector做到這一點。用戶可以點擊視圖中的後退按鈕,這個線程仍然可以執行,即使我的所有屬性都已經釋放導致崩潰。

在此先感謝!

James

回答

4

我發現我的問題,它與我的performSelector調用沒有任何關係。我發現你必須在釋放它們之前將你的MKMapView和CLlocationManager的delgate設置爲零。否則,他們將繼續工作,即使您已經發布了這些實例,並且它們有可能會導致您的應用程序崩潰。

感謝您的幫助諾亞!

2

我遇到了類似的問題,我不知道,我被安排在不同的對象的多個performSelector的電話,以「自我」在每種情況下的不同。

我建議在的NSLog投擲(@ 「自我:%@」,個體經營);

- (void) viewDidLoad { 
    NSLog(@"Self: %@",self); before 
    [self performSelector:@selector(myStopUpdatingLocation) withObject:nil afterDelay:6]; 
} 

- (void) viewWillDisappear:(BOOL)animated { 
    NSLog(@"Self: %@",self); before 
    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(myStopUpdatingLocation) object:nil]; 
} 

,讓您比較SELF情況,以確保您正在執行和釋放同一個對象的選擇:每個你的代碼位如前。