我正在使用一个块来执行与网络相关的任务

当我的UITableViewController中的块完成时,我想重新加载tableviewcontroller

__unsafe_unretained UITableView *unretTableView = self.tableview;

[myRequest postWithCompletion:(bool finished) {
    [unretTableView reloadData];
}];


这很好,除了如果我在请求完成之前离开(deallocateUITableViewController之外,即使在unretTableView方法中,我似乎也指向发送到已释放实例的已释放对象([UITableViewController dealloc])消息。 (被称为)我设置了self.tableview = nil;

额外细节:


无法使用__weak,我的目标是iOS 4.3及更高版本
UITableViewControllerdealloc方法中,我设置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/

10-12 16:42