ios使用copy方法调用块目标,但崩溃了

ios invoke block target with copy method,but crashed

提问人:Y Robin 提问时间:6/2/2021 最后编辑:newacctY Robin 更新时间:7/9/2021 访问量:185

问:

here is screen shot

我使用调用调用块复制,我认为它等于[块复制],但为什么崩溃了?

@implementation MyService
    + (void)load {
        [MyService startRequest:^(id  _Nonnull responseObject, NSError * _Nonnull error) {
            NSLog(@"%@",self);
        }];
    }
    
    + (void)startRequest:(void (^)(id responseObject,NSError *error))object {
        
            SEL sel = @selector(copy);
            NSMethodSignature* methodSign = [object methodSignatureForSelector:sel];
            NSInvocation* invocation = [NSInvocation invocationWithMethodSignature:methodSign];
            [invocation setSelector:sel];
    
            [invocation setTarget:object];
            [invocation invoke];
    }
@end
ios objective-c 内存管理 nsinvocation

评论


答:

0赞 newacct 7/9/2021 #1

由于未记录的功能(请参阅此答案),在块上调用 NSInvocation 实际上会调用块,而不是向块对象发送消息。您提供的方法签名不是实际块调用的方法签名,因此会导致未定义的行为。