gpt4 book ai didi

ios - iPhone Motion - EXC 错误访问

转载 作者:塔克拉玛干 更新时间:2023-11-02 10:19:37 25 4
gpt4 key购买 nike

我开始使用 DeviceMotion 类进行编码。遵循 Apple 的文档后,我有以下内容:

- (void)viewDidLoad {
[super viewDidLoad];
myMM = [[CMMotionManager alloc] init];
myMM.deviceMotionUpdateInterval = 1.0/30.0;
theQ = [[NSOperationQueue currentQueue] retain];


motionHandler = ^ (CMDeviceMotion *motionData, NSError *error) {
if (motionData.rotationRate.z > 5.5 || motionData.rotationRate.z < -5.5) {
NSLog(@"Rotation of Z."); // Reference A
}
};

-(IBAction)toggleClick{
NSLog(@"toggle");

if(myMM.gyroAvailable){

if(myMM.deviceMotionActive){
NSLog(@"Stopping Motion Updates..");
[myMM stopDeviceMotionUpdates];
} else {
NSLog(@"Starting Motion Updates..");
[myMM startDeviceMotionUpdatesToQueue:theQ withHandler:motionHandler];
}

}
else {
NSLog(@"No motion available. Quit!");
}

这段代码工作正常,但是当我想用 any 代码代替 NSLog(甚至像递增整数一样简单)来代替“引用 A”时,我得到一个 EXEC Bad在控制台中访问。

我环顾四周,发现是某种内存泄漏。有谁知道发生了什么事?如果没有,我怎么知道呢?我对 Instruments 非常缺乏经验,但如果我指出正确的方向,我将不胜感激。

最佳答案

EXC_BAD_ACCESS 是一个操作系统级别的异常,意味着您正在尝试访问不属于您的内存。我认为这与您的 block 在范围内有关,所以一旦它超出范围,它就会被销毁。您需要在堆上创建它的副本。

尝试 this answer来自著名的 Dave DeLong。此外,与正常的 Cocoa 内存管理规则一样,如果您制作了副本,请不要忘记释放它。

例如:

motionHandler = Block_copy(^ (CMDeviceMotion *motionData, NSError *error) {
if (motionData.rotationRate.z > 5.5 || motionData.rotationRate.z < -5.5) {
NSLog(@"Rotation of Z."); // Reference A
}
});


// and then later:

- (void) dealloc
{
[motionHandler release];
//and all others.
[super dealloc];
}

关于ios - iPhone Motion - EXC 错误访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4281956/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com