Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/120.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在块c中调用类级代码_Ios_Objective C_Block - Fatal编程技术网

Ios 在块c中调用类级代码

Ios 在块c中调用类级代码,ios,objective-c,block,Ios,Objective C,Block,我有一个函数,它调用get服务并将数据返回到一个块,该块作为参数传递给函数。 我已经创建了一个通用块函数处理程序,它可以将任何块作为参数,该参数有两个变量。一个是BOOL,另一个是id 问题是,若我在“调用函数”中添加任何包含包含类级函数/属性的代码的行,那个么“调用函数”中的代码在分派时崩溃 调用函数 调用函数 } 问题 问题是,如果我对执行的行[self-emptyFunction]进行注释,并且没有崩溃。但若我取消注释该行或添加任何其他包含控制器变量/类级变量(调用控制器)的行,则在调度行

我有一个函数,它调用get服务并将数据返回到一个块,该块作为参数传递给函数。 我已经创建了一个通用块函数处理程序,它可以将任何块作为参数,该参数有两个变量。一个是
BOOL
,另一个是id

问题是,若我在“调用函数”中添加任何包含包含类级函数/属性的代码的行,那个么“调用函数”中的代码在分派时崩溃

调用函数 调用函数 }

问题 问题是,如果我对执行的行
[self-emptyFunction]
进行注释,并且没有崩溃。但若我取消注释该行或添加任何其他包含控制器变量/类级变量(调用控制器)的行,则在调度行的被调用函数处会发生崩溃

我试过各种方法。在
视图中调用它。对控制器进行弱引用,然后调用该函数,但没有使用


我无法理解为什么在块中调用类级变量会导致我出错。

使用
\uuuu bridge\u transfer
时出错<代码>\u桥接\u传输
使用保留计数。但是,您从未对该块对象执行过不平衡保留。因此,这可能会导致过度释放。您应该将其改为just
\u bridge


此外,您应该将强制转换从
void*
(非托管指针类型)移回块类型,移到发送到
dataTaskWithRequest:
的块外部,因为块需要知道它正在捕获块类型的变量,以便在复制自身时正确复制它。

什么类型的错误?那个街区什么时候叫?对象是否已解除分配?为什么要在getWithBlock方法中进行块转换?为什么不保证类型安全,只接受一种类型的块?在
控制器工作后,请尝试打印
控制器
,查看它是否为零或指向正确的对象。错误很简单。控制台上没有详细信息。发生简单的崩溃。每当我在ViewWillDisplay中执行该代码时,代码会在没有任何日志的情况下崩溃。块在ViewWillDisplay中被调用。我正在进行转换,因为我希望第二个参数是一个可以有两个参数的块,并且任何类型的块都可以作为参数传递给我自己检查过的函数。如果成功,则该块中的表达式无效。布洛克不知何故不知道什么是自我。这是一个不好的表达。因此,没有任何变量被识别。
-(void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    Controller * __weak controller = self;

    [network getWithBlock:(__bridge void *)(^(BOOL isSuccess, id responseData)
     {
         if(isSuccess)
         {
             NSLog(@"Successful Get");
             NSDictionary *data = responseData;
             if(data == nil)
             {
             }
             else
             {
                 NSLog(@"It is working %@");
                 [self emptyFunction];  // [controller emptyFunction];                 
             }
         }
         else
         {
             NSLog(@"Failure");
         }
     })];
}
- (void) getWithBlock:(void *) block
{
    //some code
    NSURLSessionDataTask *postDataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
       {
           NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
           void (^responseBlock)(BOOL isSuccess,id object) = (__bridge_transfer typeof(responseBlock)) block;
//some response conversion into dict

           dispatch_async(dispatch_get_main_queue(), ^{
               responseBlock(YES, dict);
           });
     }];

    [postDataTask resume];