ios 使用多线程导致内存上升闪退问题


应用场景描述:

主要是uitableviewCell里面需要读取大点的图片,比较耗时。想使用多线程的方式

1、我的代码如下


 
- (void)viewDidLoad { [super viewDidLoad]; self.queue = [[NSOperationQueue alloc] init]; self.queue.maxConcurrentOperationCount = 1; }

请注意,我已经设置了每次只能执行1个线程。

2、然后呢,在cell里面的代码:


 NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self
                                                                                       selector:@selector(showLocalImage:)
                                                                                         object:assetURL];

                [self.queue addOperation:operation];

3、线程执行的函数如下


 - (void)showLocalImage:(NSURL*)assetURL
{

    ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
    [library assetForURL:assetURL resultBlock:^(ALAsset *asset) {

               if (asset != nil) {

            UIImage *image = [self thumbnailForAsset:asset maxPixelSize:1024/2];//这是耗时比较大的操作。

                [self performSelectorOnMainThread:@selector(updateUI:) withObject:image waitUntilDone:YES];


        }


    }failureBlock:^(NSError *error) {

    }];



}


-(void)updateUI:(UIImage*) image{
    NSLog(@"通知了主线程更新ui");
}

上面就是完整过程了。那个耗时比较大的操作。如果我不用多线程的话,会一个一个进行下去。时间是比较久,但是没出现内存上升的问题。

我的意思是,这个操作不会出现内存泄露问题。

所以现在使用多线程导致的内存上升,我是怀疑是不是每次执行1个线程这个限制没有起作用,导致多个线程同时运行,造成的内存上升

如何解决这个问题呢?

-------补充---------
最后我证实了我的想法,果然是并发数没起作用,多个线程一窝端执行了。
不知道如何限制了,一个线程结束的标志是什么?也许在这个例子里,程序认为上一个线程已结束就开始执行下一个了,可实际上那个线程并未结束。

多线程

Mouse酱 9 years, 8 months ago

Your Answer