Objective-C 从 Swift 分配的块在分配后为零

Objective-C Block assigned from Swift is nil after assignment

这与有关从 Swift 访问 ObjC 回调的其他问题高度相关。但我的研究还没有取得成果。

有人能看看我是否可能在此处做错语法吗?

我已将以下 Objective-C 回调声明为:

#import <UIKit/UIKit.h>

@class KxMovieDecoder;

typedef void (^KX_FIRST_FRAME_CALLBACK)() ;


extern NSString * const KxMovieParameterMinBufferedDuration;    // Float
extern NSString * const KxMovieParameterMaxBufferedDuration;    // Float
extern NSString * const KxMovieParameterDisableDeinterlacing;   // BOOL

@interface KxMovieViewController : UIViewController<UITableViewDataSource, UITableViewDelegate> {
    KX_FIRST_FRAME_CALLBACK firstFrameLoaded;
}

+ (id) movieViewControllerWithContentPath: (NSString *) path
                               parameters: (NSDictionary *) parameters;

@property (readonly) BOOL playing;
@property (nonatomic, copy) KX_FIRST_FRAME_CALLBACK firstFrameLoaded;

- (void) play;
- (void) pause;

@end

当我从 swift 代码分配给它时,分配后它仍然为零:

public func startViewing() -> UIViewController {

        kxMoviePlayer = KxMovieViewController.movieViewControllerWithContentPath(rtspURL, parameters: nil) as? KxMovieViewController
        kxMoviePlayer!.firstFrameLoaded = {
            self.onFirstFrameOfVideo()
        }

只需将一个具有类似设置的空白项目放在一起,它就可以正常工作。不过有几个问题。

您是要同时拥有一个实例变量和一个名为 firstFrameLoaded 的 属性 吗?您的自动合成 属性 没有使用实例变量,而是使用自动生成的 _firstFrameLoaded 实例变量。也许这就是混淆的根源,您打算在 i-var 前加上下划线?

为什么回调 属性 是 copy 而不是指示 strongweak 引用?