0

我为异步 http 请求处理设计了一个类“AsyncHttpRequest”,并且类初始化程序将一个块作为参数。

该块是从“AsyncHttpRequest”类的以下委托实现中调用的:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {

   NSDictionary *dict = [NSJSONSerialization
        JSONObjectWithData:_dataResponseData //1
                   options:kNilOptions
                     error:&error];

   myBlock(dict); 

}

我正在从视图控制器创建上述类的实例,如下所示

- (void)viewDidLoad {
    [super viewDidLoad];
__block NSDictionary *myDic; 

AsyncHttpRequest *r = [[AsyncHttpRequest alloc] initWithUrl:urlStr withBlock:^(NSDictionary *d){

        NSLog(@"List = %@",d);  //Its working
        NSDictionary *locDic = [[NSDictionary alloc] initWithDictionary:d]; 
         // the above is working

        myDic = d; //not working

        myDic = [[NSDictionary alloc] initWithDictionary:locDic]; 
            // The above code is not working..   
     }];
}

它给出以下错误:错误:地址不包含指向目标文件中的部分的部分

有没有办法将数据从块保存到 obj-c 中的属性或外部对象?

谢谢....我在过去 3 个小时里一直在尝试这个,但没有得到任何解决方案。

谢谢

4

2 回答 2

1

我认为它有可能在myDic被使用之前被释放。

这是我的推理,-[AsyncHttpRequest initWithUrl:withBlock:]捕获块,但myDic不保留。在将来的某个时候,该connectionDidFinishLoading方法被调用,但到那时该myDic变量现在已经超出范围,因为它已被释放。

说得通?

如果是这种情况,那么可能的解决方案可能包括:

  • myDic在将其传递给方法之前保留-[AsyncHttpRequest initWithUrl:withBlock:]。注意:myDic应该是一个实例变量/
  • 在 上创建一个NSDictionary属性AsyncHttpRequest并将该属性设置为myDic.
于 2012-11-15T22:06:08.407 回答
0

我找到了解决方案。

如果从委托方法实现中调用块,则它给出错误。

在我的例子中,

- (void)connectionDidFinishLoading:(NSURLConnection *)connection { 
   ............
   ....... 
   myBlock(...);
 }

是 NSURLConnectionDataDelegate 的一个实现,我已经从上述方法内部调用了 block 函数。

它给出了意想不到的结果,即在块函数之外声明的任何变量或对象(属性或实例变量)都不能从块内访问。例如,

__block NSDictionary *myDic; 

AsyncHttpRequest *r = [[AsyncHttpRequest alloc] initWithUrl:urlStr withBlock:^(NSDictionary *d){
    NSLog(@"List = %@",d);  //Its working
    NSLog(@"List = %@",myDic); //not working


 }];

在上面的代码中,myDic 在块外声明,访问它会产生运行时错误。

有人在不理解我的问题的情况下否决了我的问题,如果有人说对了,我将非常感激。

谢谢....

于 2012-11-15T23:26:35.203 回答