ios - 为什么在 XCode 调试器中使用 "Step over"功能会隐藏本应强大的弱属性的问题

标签 ios objective-c xcode debugging

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

基本上,我有一个像这样的属性:

@property(弱,非原子)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];

如前所述,这对某些设备/模拟器组合有效,但对其他组合无效,这很奇怪。将 myMapweak 更改为 strong 使其适用于所有组合。

我在调试过程中遇到了一些奇怪的行为,这使得这很难确定。我首先在为 self.myMap(上面列出的)赋值的行上放置一个断点,以检查该行是否被命中。现在,在调试时,它按预期命中了这个断点。但奇怪的是,以下行为因我点击的是Continue program execution 还是Step over 而异。如果我点击 Continue program execution,几行之后 self.myMap 仍然是 nil,我在其中设置了另一个断点。如果我点击 Step over 然后在点击 Continue program execution 之后立即,当几行之后的断点被击中时 self.map 被正确分配.

因此,同一程序的执行会导致弱属性 self.myMap 的不同分配,这完全取决于我是否在点击 Step over 之后第一个断点。所以我的主要问题是:

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

而且我猜这可能与在某些设备/模拟器组合上工作的弱变量有关,也可能不相关,但与其他设备/模拟器组合无关。作为引用,XCode 5.1。

最佳答案

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

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

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

关于ios - 为什么在 XCode 调试器中使用 "Step over"功能会隐藏本应强大的弱属性的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22357280/

相关文章:

ios - 将 C 库更改为 IOS 库时出现错误

ios - 如何将数据发送到以编程方式创建的弹出窗口?

objective-c - Objective C 标签行间距?

objective-c - 应用验证失败 : Unable to create Configuration directory:/user/username/. itmstransporter

swift - 如何使用 SpriteKit AR 在 Swift 中的 SKScene 上创建覆盖 SCNScene?

ios - SwiftUI 删除 View 上的空格

ios - 在另一个 View 上设置 setNeedsDisplay

iphone - CGContext 设置文本在生成 pdf 时对齐

ios - 使用Objective-C在iPhone中使用配置文件安装字体

ios - 使用 WhirlyGlobe 和 GRDB pod 时找不到“sqlite3.h”文件