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