取消已释放对象中的块请求

Posted

技术标签:

【中文标题】取消已释放对象中的块请求【英文标题】:cancel block request in already deallocated object 【发布时间】:2011-10-09 11:21:13 【问题描述】:

所以我使用AFNetworking 来通过网络服务进行异步请求。

AFJSONRequestOperation *operation = [AFJSONRequestOperation operationWithRequest:request success:^(id JSON)
    
        [self doSomeStuff];

     failure:^(NSHTTPURLResponse *response, NSError *error)
    
        XLog("%@", error);
    ];

    NSOperationQueue *queue = [[[NSOperationQueue alloc] init] autorelease];
    [queue addOperation:operation];

现在在请求完成之前释放“self”对象会发生什么,我的应用程序当然会在[self doSomeStuff]; 上崩溃。

有没有办法在释放我的对象时取消这个块请求?

【问题讨论】:

【参考方案1】:

据我所知,您应该可以致电cancel 停止操作。

【讨论】:

【参考方案2】:

我做了一些示例代码,你可能会对结果感兴趣。

我创建了一个创建请求的类,就像你的一样:

@implementation Aftest
@synthesize name = _name;
- (void) doSomeStuff

    NSLog(@"Got here %@", self.name);


- (void)startDownload
   
      self.name = [NSString stringWithFormat:@"name"];
      NSURL *requestURL = [NSURL URLWithString:@"http://api.twitter.com/1/statuses/user_timeline.json?include_entities=true&include_rts=true&screen_name=twitterapi&count=2"];
      NSURLRequest *request = [NSURLRequest requestWithURL:requestURL];
      AFJSONRequestOperation *operation = [AFJSONRequestOperation operationWithRequest:request success:^(id JSON)
      
           [self doSomeStuff];

       failure:^(NSHTTPURLResponse *response, NSError *error)
      
           NSLog(@"%@", [error localizedDescription]);
      ];

      NSOperationQueue *queue = [[[NSOperationQueue alloc] init] autorelease];
      [queue addOperation:operation];

@end

并用:

Aftest *af = [[Aftest alloc] init];
NSLog(@"1 - retain count %d", [af retainCount] );
[af startDownload];
NSLog(@"2 - retain count %d", [af retainCount] );
[af release];
NSLog(@"3 - retain count %d", [af retainCount] );

我得到的结果是:

2011-10-09 09:28:41.415 aftes[6154:f203] 1 - retain count 1
2011-10-09 09:28:41.418 aftes[6154:f203] 2 - retain count 2
2011-10-09 09:28:41.419 aftes[6154:f203] 3 - retain count 1
2011-10-09 09:28:43.361 aftes[6154:f203] Got here name

您的对象在块内传递时应该被保留。它应该避免这些崩溃。

无论哪种方式,正如 Micheal 回答的那样,只要您有权访问操作对象,就应该可以调用 cancel

【讨论】:

你是对的。我在我的完整块中使用了一个类,我只分配给我的对象,这个块所在的位置。保留这个类并在 dealloc 上释放它现在可以正常工作。谢谢! 请注意,retainCount 永远不会返回 0,也不能用来证明一个对象在任何给定的持续时间内仍然是可行的。

以上是关于取消已释放对象中的块请求的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin 协程协程取消 ③ ( finally 释放协程资源 | 使用 use 函数执行 Closeable 对象释放资源操作 | 构造无法取消的协程任务 | 构造超时取消的协程任务 )

Kotlin 协程协程取消 ③ ( finally 释放协程资源 | 使用 use 函数执行 Closeable 对象释放资源操作 | 构造无法取消的协程任务 | 构造超时取消的协程任务 )

ios:ARC中的过度释放对象[关闭]

linux释放内存空间

C# 无法访问已释放的对象

linux 线程取消以及条件变量锁的释放