以下过程导致我的应用程序崩溃:
- 用户打开视图并向服务器发送请求
- 请求在后台执行
- 用户导航回根视图
- 请求已完成
并执行以下代码
// MyDatasource.m
// e.g. in connectionDidFinishLoading
[callback loadedDataSource:self];
与此同时,其他模型/视图已被解除分配,消息被发送到解除分配的实例。
callback
是类型id
并且符合KalDataSourceCallbacks
协议。
如何避免将消息发送到已释放的对象?
PS:我的问题类似于这个问题
编辑:
我将尝试callback
在方法中设置为零dealloc
(在我的数据源类中)。这并不能解决问题,因为MyDataSource
它始终存在,并且只有在释放dealloc
时才应调用该方法RootViewController
(关闭应用程序时应该发生什么)。
到目前为止我所做的:
现在MyDataSource
由 my 中的一个属性保留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
日历销毁后如何释放?这不起作用,因为我不知道日历是否已被破坏。所以数据源只能存在于整个应用程序运行时。
编辑2:
我可以检查callback
以nil
了解它是否已发布?
if (callback != nil)
[callback loadedDataSource:self];
这没有帮助。
编辑3:
该应用程序没有崩溃,因为我保留了委托:
@property (retain) id<KalDataSourceCallbacks> callback;
应该
@property (assign) id<KalDataSourceCallbacks> callback;
那么,对于我的特殊情况,如何避免将该方法loadedDataSource
发送到已释放的对象呢?