为什么在 XCode 调试器中使用“Step over”功能会隐藏本应较强的弱属性的问题

2023-12-08

我刚刚调试完 iOS Google 地图 (GMSMapView)在某些设备和某些 iOS 版本模拟器中显示,但在其他设备上则不显示。奇怪的是,它在 32 位 iOS 7 设备和 64 位 iOS 7 模拟器上崩溃,但在其他组合上却没有崩溃,这表明它不是特定于 iOS 版本或特定于 64 位的,而是其他原因。无论如何,事实上这是一个GMSMapView并且跨设备/模拟器的行为有奇怪的变化可能是题外话,但也许它与问题有关,有人可以在上下文中解释它。

基本上,我有一个类似的财产:

@property (weak, nonatomic)GMSMapView *myMap;

并且一直将其分配在viewDidLoad类似的东西:

self.myMap = [GMSMapView mapWithFrame:CGRectMake(0.0, 0.0, self.view.bounds.size.width, self.view.bounds.size.height) camera:self.myPosition];

如前所述,这适用于某些设备/模拟器组合,但不适用于其他设备/模拟器组合,这很奇怪。改变myMap from weak to strong使其适用于所有组合。

我在调试过程中遇到了一些奇怪的行为,但这使得建立起来变得困难。我首先在分配了值的行上放置一个断点self.myMap(上面列出)检查线路是否被击中。现在,在调试时,它按预期到达了该断点。但奇怪的是以下行为根据我是否击中而有所不同继续执行程序 or 跨过去。如果我打继续执行程序, self.myMap仍然nil几行后,我又遇到了另一个断点。如果我打跨过去然后在击中后立即继续执行程序, self.map当几行后断点被击中时,被正确分配。

因此,同一程序的执行会导致弱属性的不同分配self.myMap完全取决于我是否击中跨过去到达第一个断点后。所以我的首要问题是:

为什么调试器的不同进程会导致不同的结果?

我想这可能与某些设备/模拟器组合上的弱变量有关,但与其他设备/模拟器组合上的弱变量无关。作为参考,XCode 5.1。


我之前在发布和调试版本之间遇到过类似的问题。弱引用被清空的时间之间存在一些差异,大概是因为调试器出于某种原因保留了引用。我不知道 ARC 是如何实现的细节,但它似乎是一个相当一致的模式。

直接将新创建的对象分配给弱引用是错误的 - 根据 ARC 规则,它将立即释放并清空,因为没有其他对象对它具有强引用。

这是我不喜欢将视图或 IBOutlet 属性设置为弱的主要原因 - 没有必要,因为视图不再被卸载,它只会导致像这样的微妙错误。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么在 XCode 调试器中使用“Step over”功能会隐藏本应较强的弱属性的问题 的相关文章

随机推荐