为什么在XCode调试器中使用“Step over”function隐藏了应该很强的弱属性问题

我刚刚完成调试iOS谷歌地图( 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];

如前所述,这适用于某些设备/模拟器组合而不是其他设备,这很奇怪。 将myMapweak变为strong使其适用于所有组合。

我在调试期间遇到了一些奇怪的行为,但这使得这很难建立起来。 我开始在为self.myMap (上面列出)分配值的行上放置一个断点,以检查该行是否被命中。 现在,在调试时,它按预期命中了这个断点。 但奇怪的是, 以下行为会有所不同,具体取决于我是按“ 继续执行程序”还是“ 跳过” 。 如果我点击继续程序执行self.myMap仍然nil几行后我有另一个断点。 如果我点击Step over然后在点击Continue program execution后立即执行self.map当几行之后的断点被击中时, self.map被正确分配。

因此,执行相同的程序导致弱属性self.myMap的不同赋值完全基于我是否在击中第一个断点后点击Step over 。 所以我的主要问题是:

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

而且我猜这可能或者可能不会与某些设备/模拟器组合上的弱变量有关,而与其他设备/模拟器组合无关。 供参考,XCode 5.1。

在发布和调试版本之间,我遇到过类似的问题。 在弱引用被填零之间的时间上存在一些差异,可能是因为调试器由于某种原因而持有引用。 我不知道如何实现ARC的细节,但它似乎是一个相当一致的模式。

直接将新创建的对象分配给弱引用是错误的 – 根据ARC的规则,它将立即被释放并缩小,因为没有其他任何东西对它有强烈的引用。

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