NSOperationQueue错误:线程1:EXC_BAD_ACCESS(代码= 2,地址= 0x4)

时间:2013-09-25 20:45:31

标签: objective-c nsoperationqueue

我想创建NSOperationQueueNSOperatioQueue应该刷新UILable,我创建了这段代码:

NSOperationQueue * ramQueue = [NSOperationQueue alloc];
    [ramQueue addOperationWithBlock:^{
        while (TRUE) {

            //Creating String

            NSOperationQueue *main = [NSOperationQueue mainQueue];
            [main addOperationWithBlock:^{

                //Refresh Label

            }];

        }

    }];

但它不起作用,标签不显示新的字符串。在这里显示错误:[ramQueue addOperationWithBlock:^{

任何人都知道如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

好的,我想感谢Rob,指出我正确的方向!

这是我正确的代码:

首先,我创建了[NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(updateRam) userInfo:nil repeats:YES];而不是while(TRUE){}循环。然后我纠正了我的NSOperationQueue代码:

-(void)updateRam {

    NSOperationQueue * ramQueue = [[NSOperationQueue alloc] init];
    [ramQueue addOperationWithBlock:^{

        //Create String

        NSOperationQueue *main = [NSOperationQueue mainQueue];
        [main addOperationWithBlock:^{

         //Refresh Label

        }];

    }];
}

非常感谢!

答案 1 :(得分:0)

有几点想法:

  1. [NSOperationQueue alloc]应为[[NSOperationQueue alloc] init]

  2. 我通常会建议不要结束while循环。如果你想反复做某事,重复计时器(以合理的速度,可能不超过每秒10-20次)可能是一个更好的结构。如果使用while循环结构,则可以很容易地将操作发布到主队列,而不是主循环可以处理它们。 (这取决于while循环内部的内容。)

  3. 如果你继续使用那个while循环(再次,我不鼓励你这样做),你可能想要一个@autoreleasepool,所以任何自动释放的对象都会被释放。

    [ramQueue addOperationWithBlock:^{
        while (TRUE) {
            @autoreleasepool {
                //Creating String
    
                NSOperationQueue *main = [NSOperationQueue mainQueue];
                [main addOperationWithBlock:^{
    
                    //Refresh Label
                }];
            }
        }
    }];
    

    您甚至可能希望使用信号量来确保后台操作不会过快地发布事件。

  4. 可能与您的问题无关,但如果您正在执行任何更新任何共享资源(例如更改任何类属性或ivars)的操作,请确保将这些资源与主队列同步。您可以通过将这些更新分发回主队列或使用某种锁定机制来实现。