【问题标题】:Objective-C Block assigned from Swift is nil after assignment从 Swift 分配的 Objective-C 块在分配后为零
【发布时间】:2015-10-05 23:22:01
【问题描述】:

这与其他有关从 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()
        }

【问题讨论】:

  • Objective-C 的实现是什么样的?只是@synthesize 声明?此外,您的代码目前看起来可能会创建一个保留周期。如果 self 保留 kxMoviePlayer,您可能会考虑将捕获列表添加到您的块中:kxMoviePlayer!.firstFrameLoaded = { [unowned self] () -&gt; Void in self.onFirstFrameOfVideo() }。不过,这不会导致它成为nil
  • 谢谢你的提示,我会的。

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


【解决方案1】:

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

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

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

【讨论】:

  • 没有理由复制,只是从相关问题的另一个答案中复制了该内容以尝试使其正常工作。您对参考有何建议?我最初有强大的、非原子的。是的,让我检查下划线!
  • 谢谢,是的,我犯的错误是实例变量上缺少 _
  • 嗯,这更多是出于好奇,因为我不确定更大的图景是什么。通常,回调或委托将具有弱引用,因为管理被调用者的生活不是调用者的责任。我会在非回调情况下看到一份副本,在这些情况下,您正在向任务添加额外的处理,但语义在这里似乎并不正确。老实说,虽然不知道副本如何与这里的自引用闭包交互。似乎是一个保留周期。不过副本上可能有问题。
  • 谢谢,我会变得虚弱,并在创建回调的类中管理保留
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-03
  • 2012-08-15
  • 1970-01-01
相关资源
最近更新 更多