从“开始 Iphone 4 开发”中调整抖动代码导致崩溃

Posted

技术标签:

【中文标题】从“开始 Iphone 4 开发”中调整抖动代码导致崩溃【英文标题】:Adapting Shake Code from 'Beginning Iphone 4 Development' Causing Crash 【发布时间】:2011-06-01 16:48:47 【问题描述】:

下面的代码几乎是 Iphone 4 Development 中的 Shake and Bake 示例的复制品。在 CMAcceleration 加速 = accelerometerData.acceleration 之前缺少 BOOL if 语句;因为我希望这个人可以根据需要多次摇动和刷新结果。我有一个可以完美执行相同代码的按钮。当我运行代码并摇动 iphone 时,它​​崩溃了。我错过了什么可以使这项工作?你不能用一个按钮来运行与摇动方法相同的代码吗?

例子.h

#import <CoreMotion/CoreMotion.h>
#define kAccelerationThreshold 1.7
#define kUpdateInterval (1.0f/10.0f)

@interface exampleViewController : UIViewController  
CMMotionManager *motionManager;

@property (retain,nonatomic) CMMotionManager *motionManager;
@end

例子.m

@synthesize motionManager;

-(void)viewDidLoad 

self.motionManager = [[[CMMotionManager alloc] init] autorelease];
motionManager.accelerometerUpdateInterval = kUpdateInterval;
NSOperationQueue *queue = [[[NSOperationQueue alloc] init] autorelease];
[motionManager startAccelerometerUpdatesToQueue:queue
                                    withHandler:
 ^(CMAccelerometerData *accelerometerData, NSError *error)
     if (error) 
         [motionManager stopAccelerometerUpdates];
      else 
         CMAcceleration acceleration = accelerometerData.acceleration;
         if (acceleration.x > kAccelerationThreshold 
            || acceleration.y > kAccelerationThreshold 
            || acceleration.z > kAccelerationThreshold)

// There is a bunch of other stuff here, but it all works using a button called shake....
            example4.hidden = NO;
            select1.text = first;
            display.text = [[NSString alloc] initWithFormat: @"%@", first];

         
     
 ];


- (void)dealloc

[super dealloc];
[motionManager release];


- (void)viewDidUnload 
[super viewDidUnload];
self.motionManager = nil;


@end

【问题讨论】:

这帮助我使用我无法在 Google Search->*** 上找到的 CoreMotion 框架实现摇动手势。您应该将其添加为询问如何执行此操作的帖子之一的答案。 【参考方案1】:

您正在尝试在主线程以外的线程上创建和显示警报视图。 UI 更新只能在主线程中完成。您应该使用performSelectorOnMainThread:withObject:waitUntilDone: 在主线程上创建和显示。

您可以随时添加这样的 UI 更新请求 –

dispatch_async(dispatch_get_main_queue(),^
    // Put all your UI updates here; 
);

【讨论】:

嗯,我想我忽略了这一点,因为我真正的代码是隐藏图像,在 UILabel 上显示数组中的文本,并在 UITextView 上显示文本。这是否仍然适用于警报视图以外的输出?现在我想起来了,该应用程序刚刚与其他代码一起崩溃了。我将把问题编辑得更清楚,更不具象。 它们仍然是 UI 更新,对吧?他们正在其他不安全的线程上完成。【参考方案2】:

对我来说看起来很可疑的部分是NSOperationQueue *queue = [[[NSOperationQueue alloc] init] autorelease];

在motionManager 向队列调度的时间段内,您没有在任何地方等待队列。我检查了startAccelerometerUpdatesToQueue 的文档,但它并没有说接收者保留了队列,所以这可能不是你可以安全假设的。我的建议是不要自动释放队列。而是在motionManager 上调用stopAccelerometerUpdates 后在viewDidUnload 中释放它。

【讨论】:

以上是关于从“开始 Iphone 4 开发”中调整抖动代码导致崩溃的主要内容,如果未能解决你的问题,请参考以下文章

应用程序的抖动屏幕[关闭]

调整视图大小时 textview 抖动

关于 国产麒麟系统中双精度double除法编译优化导商变量不变化(代码调整+volatile) 的解决方法

关于 国产麒麟系统中双精度double除法编译优化导商变量不变化(代码调整+volatile) 的解决方法

如何使用 GridBagLayout 防止组件抖动?

时序分析中时钟抖动是啥 fpga中如何减少时钟抖动