从Swift分配的Objective-C Block在赋值后为零

时间:2015-10-05 23:22:01

标签: ios objective-c swift objective-c-blocks swift2

这与从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

当我从快速代码中分配它时,它在赋值后仍为零:

Image showing debug

public func startViewing() -> UIViewController {

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

1 个答案:

答案 0 :(得分:1)

只需将类似设置的空白项目组合在一起就可以了。但有几个问题。

你的意思是同时拥有一个实例变量和一个名为firstFrameLoaded的属性吗?您的自动合成属性不使用实例变量,而是使用自动生成的_firstFrameLoaded实例变量。也许这是混乱的根源,你的意思是在i-var前加一个下划线?

回调属性的任何原因是copy而不是指示strongweak引用?