Swift 4: XCode 9 Beta: Objective-C 中的静态工厂方法在 Debugger 中生成有效对象,但在代码中生成 NIL
Swift 4: XCode 9 Beta: Static factory method in Objective-C produces a valid object in Debugger, but NIL in the code
我有以下 Swift class:
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 Beta 9.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
时,该行的其余部分将被安全地忽略并且不执行任何操作。
我有以下 Swift class:
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 Beta 9.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
时,该行的其余部分将被安全地忽略并且不执行任何操作。