我刚刚调试完一个问题,即 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];
如前所述,这对某些设备/模拟器组合有效,但对其他组合无效,这很奇怪。将 myMap
从 weak
更改为 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/