我开始使用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!");
}
这段代码工作正常,但是当我想要除了NSLog之外的任何代码(甚至像递增整数这样简单的东西)代替'reference A'时,我得到一个执行错误在控制台中访问。
我环顾四周,而且我发现它是一种内存泄漏。有谁知道发生了什么?如果没有,我怎么能搞清楚?我对乐器很缺乏经验,但如果我指出了正确的方向,我将不胜感激。
答案 0 :(得分:3)
EXC_BAD_ACCESS
是操作系统级异常,意味着您正在尝试访问不属于您的内存。我认为这与你的作用域的本地块有关,所以一旦它超出范围,就会被破坏。您需要在堆上创建它的副本。
尝试着名的Dave DeLong this answer。此外,与正常的Cocoa内存管理规则一样,如果您已复制,请不要忘记release
。
例如:
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];
}