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