我有以下速成班:
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;
当
videoPlayer
是nil
时,可以安全地忽略该行的其余部分,而它不执行任何操作。第一行的内容都一样:
videoPlayer? = IPVideoEmbedderControl.generatePlayer()
当
videoPlayer
是nil
时,可以安全地忽略该行的其余部分,而它不执行任何操作。关于ios - Swift 4:XCode 9 Beta:Objective-C中的静态工厂方法在Debugger中生成有效对象,但代码中为NIL,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45763738/