我正在使用手动引用计数和 Xcode 4.5。
我声明了一个 ivar:
UIAccelerometer *accelerometer;
加速度计不是财产。我在一种方法中有这个代码:
accelerometer = [UIAccelerometer sharedAccelerometer];
accelerometer.delegate = self;
在第二种方法中,我有:
accelerometer.delegate = nil;
在另一种稍后运行的方法中,我有:
accelerometer.delegate = self;
通过这个设置,我偶尔(很少而且看似随机)得到以下中止:
'NSInvalidArgumentException',原因:'-[NSPathStore2 setDelegate:]:无法识别的选择器发送到实例 xxx
在寻找这种中止的原因后,我尝试在第一次使用加速度计时保留它,之后没有中止。但我担心保留并没有解决真正的问题。考虑这个“解决方案”的原因是中止消息抱怨调用 setDelegate 并且在似乎相关的代码部分中,我设置的唯一代表是加速度计。但我不明白为什么这应该解决它,我担心保留只是以一种恰好隐藏问题的方式转移代码。
我理解的方式是
accelerometer = [UIAccelerometer sharedAccelerometer];
创建一个单例实例,该实例在其所在的实例的持续时间内具有相同的地址,并且该地址被分配给加速度计,该地址在实例的持续时间内也存在。如果是这样,为什么保留会改变什么?
sharedAccelerometer 单例可以在它所在的实例被释放之前被释放吗?