0

我正在使用手动引用计数和 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 单例可以在它所在的实例被释放之前被释放吗?

4

1 回答 1

0

如果加速度计是ivar,保留你放在那里的任何对象都是正确的......所以这段代码

accelerometer = [UIAccelerometer sharedAccelerometer];
accelerometer.delegate = self;

应该

accelerometer = [ [ UIAccelerometer sharedAccelerometer ] retain ] ;
accelerometer.delegate = self;

并在-dealloc中添加

[ accelerometer release ] ;
accelerometer = nil ;
于 2012-10-12T18:12:59.637 回答