我刚刚调试了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];
如前所述,这适用于某些设备/模拟器组合而不是其他设备,这很奇怪。将myMap
从weak
更改为strong
会使其适用于所有组合。
我在调试期间遇到了一些奇怪的行为,但这使得这很难建立起来。我开始在一行上设置一个断点,该值为self.myMap
(上面列出的)赋值,以检查该行是否被击中。现在,在调试时,它按预期命中了这个断点。但奇怪的是,以下行为会有所不同,具体取决于我是否点击继续执行程序或跳过 。如果我点击继续执行程序,self.myMap
在我有另一个断点的几行之后仍然是nil
。如果我点击跳过,然后在点击继续执行程序后立即执行,则在几行之后的断点被点击时,self.map
被正确分配。
因此,执行相同的程序会导致弱属性self.myMap
的不同分配,完全取决于我是否在点击第一个断点后点击 Step over 。所以我的主要问题是:
为什么通过调试器的不同进程会导致不同的结果?
我想这可能或者可能不会与某些设备/模拟器组合上的弱变量有关,但与其他设备无关。供参考,XCode 5.1。
答案 0 :(得分:1)
在发布版本和调试版本之前,我遇到过类似的问题。填充弱引用之间的时序存在一些差异,可能是因为调试器由于某种原因而持有引用。我不知道如何实现ARC的细节,但它似乎是一个相当一致的模式。
直接将新创建的对象分配给弱引用是错误的 - 根据ARC的规则,它将被立即释放并缩小,因为没有其他任何内容可以强烈引用它。
这是我不喜欢将视图或IBOutlet属性设置为弱的主要原因 - 没有必要,因为视图不再被卸载,它只会导致像这样的细微错误。