为什么要使用" Step over" XCode调试器中的功能隐藏了应该很强的弱属性问题

时间:2014-03-12 16:06:36

标签: ios objective-c xcode debugging

我刚刚调试了iOS Google Map(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。如果我点击跳过,然后在点击继续执行程序后立即执行,则在几行之后的断点被点击时,self.map被正确分配。

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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