繁体   English   中英

从Swift调用存储在NSDictionary中的Objective-C块

[英]Call Objective-C block stored in NSDictionary from Swift

预期的结果:我创建了一个块,将其存储在NSDictionary中,将字典传递给Swift类,从字典中检索该块,然后调用该块。

实际结果:从词典中检索该块会导致EXC_BAD_INSTRUCTION。

示例代码Obj-C View Controller:

- (void)viewDidLoad {
    [super viewDidLoad];

    void (^completionHandler)() = ^() {
        [self printBlahBlah];
    };

    NSDictionary *dict = @{@"blah":completionHandler};
    Nav *nav = [Nav new];
    [nav done:dict];
}

-(void)printBlahBlah { NSLog(@"BlahBlah"); }

Nav Swift类的示例代码:

@objc public class Nav : NSObject {

    @objc public func done(dict: NSDictionary){
        let block = dict["blah"] as! ()->Void //EXC_BAD_INSTRUCTION
        block()
    }
}

所以这工作:

@objc public class Nav : NSObject {

    typealias MyFunBlock = @convention(block) () -> Void;

    @objc public func done(dict: NSDictionary){
        let block = unsafeBitCast(dict["blah"], BoolBlock.self) as BoolBlock?
        block?()
    }
}

但是unsafeBitCast的文档说:

/// Returns the bits of `x`, interpreted as having type `U`.
///
/// - Warning: Breaks the guarantees of Swift's type system; use
///   with extreme care.  There's almost always a better way to do
///   anything.
///
@warn_unused_result
public func unsafeBitCast<T, U>(x: T, _: U.Type) -> U

我觉得我不想用这个。

这家伙真的值得赞扬: https : //stackoverflow.com/a/28376909/1366911

我认为正在发生的事情是该块在Swift中使用之前已被释放。 通过将其复制到集合中进行修复...

// ...
NSDictionary *dict = @{@"blah":[completionHandler copy]};
// ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM