【问题标题】:iOS Blocks Async Callbacks Causing Crash after View Controller is deallocatediOS 阻止异步回调在 View Controller 被释放后导致崩溃
【发布时间】:2012-11-29 07:44:33
【问题描述】:

我有一个单例类,它的方法以成功和失败块作为参数,它调用另一个异步执行的方法,也使用成功和失败块。我的方法的成功块由异步方法的成功块调用。一切都很好,除非我的视图控制器在成功块返回之前被释放,在这种情况下应用程序崩溃。

这种情况似乎类似于在 dealloc 方法中将委托设置为 nil。我应该如何处理块?

我的代码如下所示:

- (void)getObjectsWithId:(NSInteger)id success:(void (^)(NSArray *objects))success failure:(void (^)(NSInteger statusCode, NSError *error))failure {

    NSString *path = [NSString stringWithFormat:@"/my_objects/%d/objects", id];

    [self getPath:path parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSMutableArray *objects = [[NSMutableArray alloc] initWithCapacity:[responseObject count]];

        for (NSDictionary *dict in responseObject) {
            Object *object = [[Object alloc] initWithDictionary:dict];
            [objects addObject:object];
        }

        success(objects);
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        failure(operation.response.statusCode, error);
    }];
}

【问题讨论】:

  • 您需要显示getPath:parameters:success:failure: 方法的代码
  • 我正在使用 ARC,getPath:parameters:success:failure: 方法是 AFNetworking 的一部分。
  • 你遇到了什么样的“崩溃”?任何堆栈跟踪?
  • 遗憾的是没有堆栈跟踪

标签: ios crash block


【解决方案1】:

您可以使用通知中心来监听视图何时被释放并将块设置为 nil,这样它就不会尝试返回任何内容..

在视图被释放之前发布通知:

[[NSNotificationCenter defaultCenter]
 postNotificationName:@"myNotificationName"
 object:broadcasterObject];

并注册活动:

[[NSNotificationCenter defaultCenter]
 addObserver:listenerObject
 selector:@selector(receivingMethodOnListener:)
 name:@"myNotificationName"
 object:nil];

【讨论】:

    猜你喜欢
    • 2012-02-27
    • 1970-01-01
    • 2021-10-28
    • 2011-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多