我正在使用一个块来执行与网络相关的任务
当我的UITableViewController
中的块完成时,我想重新加载tableviewcontroller
__unsafe_unretained UITableView *unretTableView = self.tableview;
[myRequest postWithCompletion:(bool finished) {
[unretTableView reloadData];
}];
这很好,除了如果我在请求完成之前离开(
deallocate
)UITableViewController
之外,即使在unretTableView
方法中,我似乎也指向发送到已释放实例的已释放对象([UITableViewController dealloc]
)消息。 (被称为)我设置了self.tableview = nil;
额外细节:
无法使用
__weak
,我的目标是iOS 4.3及更高版本在
UITableViewController
的dealloc
方法中,我设置self.tableview = nil
离开页面时,我不想取消网络请求,我希望它继续运行。
编辑:我也不想在块中保留self.tableview
谢谢!
最佳答案
鉴于您的意见,我可能倾向于采用NSOperationQueue
。这样你可以
创建背景NSOperationQueue
;
如果下载允许一定数量的同时下载,则可以设置maxOperationCount
(或者如果要串行,则将其设置为1)。
在启动后台作业时,可以创建NSOperation
对象,也可以通过NSOperationQueue
直接将其提交给带有块的addOperationWithBlock
。如果您想享受检查isCancelled
标志的功能,则可能需要使用前者。
每个操作都可以在尝试更新视图控制器之前检查它是否被取消。
关闭视图控制器后,它可以执行简单的cancelAllOperations
来取消排队的所有内容。
这是一个随机的例子:
- (void)viewDidLoad
{
[super viewDidLoad];
self.queue = [[NSOperationQueue alloc] init];
self.queue.maxConcurrentOperationCount = 4;
// let's add 100 operations to our queue
for (NSInteger i = 0; i < 100; i++)
{
NSBlockOperation *operation = [[NSBlockOperation alloc] init];
__unsafe_unretained NSBlockOperation *weakOperation = operation; // it seems vaguely disturbing to do this with __unsafe_unretained, but given that the operation queue is taking care of this for us, I believe it's ok
[operation addExecutionBlock:^{
NSLog(@"Beginning operation %d", i);
sleep(10);
if ([weakOperation isCancelled])
NSLog(@"Operation cancelled %d", i);
else
{
// go ahead and update UI if you want
NSLog(@"Finished operation %d", i);
}
}];
[self.queue addOperation:operation];
}
}
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
[self.queue cancelAllOperations];
}
关于objective-c - __unsafe_unretained导致消息发送到已释放实例,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13809584/