我有以下速成班:

class VideoFaceDetectionController: UIViewController, IPVideoEmbedderControlDelegate {

var videoPlayer: IPVideoEmbedderControl?  // Note, not a weak reference
...

然后在Objective-C(在引用的静态库中)中有一个方法:generatePlayer(),如下所示:
+ (IPVideoEmbedderControl*)generatePlayer
{
    IPVideoEmbedderControl* control = [IPLoad
        objectWithClass:[IPVideoEmbedderControl class]
        fromBundle:[NSBundle bundleWithIdentifier:videoFrameworkBundleID]];

    control.provider = [IPVideoPlaybackFactory getProvider];

    [control createEmbeddingView];
    return control;
}

我用Swift 4这样称呼它:
videoPlayer? = IPVideoEmbedderControl.generatePlayer()
videoPlayer?.translatesAutoresizingMaskIntoConstraints = false;

现在我在第二行设置了一个断点(translatesAuto…),并检查videoPlayer。没有。
现在我在控制台中执行po IPVideoEmbedderControl.generatePlayer(),它会生成一个有效的实例,甚至有一个帧:
 (lldb) po IPVideoEmbedderControl.generatePlayer()
▿ Optional<IPVideoEmbedderControl>

(lldb) po IPVideoEmbedderControl.generatePlayer().description
"<IPVideoEmbedderControl: 0x7faf88c19390; baseClass = UIControl; frame = (0 0; 320 349); autoresize = W+H; layer = <CALayer: 0x60c0002265c0>>"

那么,在调试器中,如何生成并返回有效的对象,而在代码中,从相同的精确方法返回NIL值呢?
我使用的是Xcode Beta9.0(第5版),带有iPad Air 2(iOS 11)模拟器。我现在无法在物理设备上验证,因为我还没有任何运行iOS 11的设备。

最佳答案

如果这一行不是打印错误,并且您确实在应用程序中使用了它,则它无法按您的预期工作:

videoPlayer? = IPVideoEmbedderControl.generatePlayer()

尝试将行更改为:
videoPlayer = IPVideoEmbedderControl.generatePlayer()

你知道下一行是一种可选的链接。
videoPlayer?.translatesAutoresizingMaskIntoConstraints = false;

videoPlayernil时,可以安全地忽略该行的其余部分,而它不执行任何操作。
第一行的内容都一样:
videoPlayer? = IPVideoEmbedderControl.generatePlayer()

videoPlayernil时,可以安全地忽略该行的其余部分,而它不执行任何操作。

关于ios - Swift 4:XCode 9 Beta:Objective-C中的静态工厂方法在Debugger中生成有效对象,但代码中为NIL,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45763738/

10-11 22:32
查看更多