以下過程導致我的應用程序崩潰:如何避免回調發送到釋放實例
- 用戶打開視圖和請求被髮送到
- 執行請求的服務器在背景
- 用戶導航回到根視圖
- 請求已經完成
和以下共同德執行
// MyDatasource.m
// e.g. in connectionDidFinishLoading
[callback loadedDataSource:self];
在其他模型/視圖已釋放的同時,消息被髮送到一個釋放的實例。
callback
是id
類型,並符合KalDataSourceCallbacks
protocoll。
如何避免消息發送到釋放對象?
PS:我的問題是類似this question
編輯:
我會嘗試設置callback
爲零的dealloc
方法(在我的數據源類)。這並不能解決問題,因爲MyDataSource
總是存在,並且dealloc
方法應該只在RootViewController
被髮布(應用程序關閉時會發生什麼)時被調用。
什麼我迄今所做的:
現在MyDataSource
由物業在我RootViewController
保留:
// RootViewController.h
@property (retain) MyDataSource *dataSource;
// RootViewController.m
@synthesize dataSource;
// ...
self.dataSource = [[[MyDataSource alloc] init] autorelease];
kal.dataSource = dataSource;
- (void)dealloc {
[dataSource release];
// ...
}
KalViewController不保留它的數據源。您可能希望將一個對dataSource的引用存儲在一個實例變量中,以便在日曆銷燬後釋放它。
我還創建了一個callback
屬性:
// MyDataSource.h
@property (retain) id<KalDataSourceCallbacks> callback;
// MyDataSource.m
@synthesize callback;
// ...
- (void)presentingDatesFrom:(NSDate *)fromDate to:(NSDate *)toDate delegate:(id<KalDataSourceCallbacks>)delegate {
// ...
self.callback = delegate;
}
- (void)dealloc {
[callback release];
callback = nil;
// ...
}
目前該應用程序不會崩潰。我必須在設備上進行測試。添加callback = nil
在這裏沒有做任何事情,因爲dealloc永遠不會被調用。
日曆銷燬後應如何釋放MyDataSource
?這不起作用,因爲我不知道日曆是否已被銷燬。所以dataSource只能存在於整個應用程序運行時。
編輯2:
我可以檢查callback
爲nil
,以找出是否已經釋放?
if (callback != nil)
[callback loadedDataSource:self];
這沒有幫助。
編輯3:
該應用程序並沒有崩潰,因爲我保留了委託:
@property (retain) id<KalDataSourceCallbacks> callback;
應該
@property (assign) id<KalDataSourceCallbacks> callback;
所以,我怎麼能避免這種情況的方法loadedDataSource
是發送給我的特例的釋放對象?
委託在'MyDataSource'類中。 – testing 2010-10-29 14:31:09
您可以以@property的身份訪問它。仍然不確定這是否是首選的方式。 – fabb 2011-08-24 09:11:50