gpt4 book ai didi

iphone - 在iPad编程中使用多线程时出现问题(用于加载大量图像)

转载 作者:行者123 更新时间:2023-12-03 13:17:57 25 4
gpt4 key购买 nike

我应该将大量图像加载到滚动 View 上,我想这将需要一些时间和内存。因此,我使用了一个单独的线程在后台加载这些图像。我使用了以下多线程方法
[NSThread detachNewThreadSelector:@selector(prepareSliderView) toTarget:self withObject:nil];

将图像加载到单独的线程上。在实现此方法时,我在GDB中收到以下消息

NSAutoreleaseNoPool(): Object 0x10647180 of class NSPathStore2 autoreleased with no pool in place - just leaking
NSAutoreleaseNoPool(): Object 0x10647300 of class NSPathStore2 autoreleased with no pool in place - just leaking
NSAutoreleaseNoPool(): Object 0x10646a00 of class NSCFString autoreleased with no pool in place - just leaking
NSAutoreleaseNoPool(): Object 0x10647480 of class NSPathStore2 autoreleased with no pool in place - just leaking
NSAutoreleaseNoPool(): Object 0x10646a20 of class UIImage autoreleased with no pool in place - just leaking

我不知道这是什么意思,因为我以前从未执行过此方法。所以,我的问题是

1-我是否应该使用一些自动释放池以及此方法

2-是否有其他方法可以加载大量图像而又不增加主线程的加载量
-(IBAction)prepareSliderView{
NSLog(@"Preparing slider view");

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

int totalPages=[kbDataSource numberOfPagesInBook];
sliderScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, self.view.frame.size.height-300, self.view.frame.size.width,200 )];
sliderScrollView.contentSize = CGSizeMake(totalPages*150+((totalPages-1)*10), 200);
sliderScrollView.backgroundColor=[[UIColor blackColor] colorWithAlphaComponent:1.0];
thumbnailContentView = [[UIView alloc] initWithFrame:CGRectMake(10, 0, sliderScrollView.contentSize.width, sliderScrollView.contentSize.height)];

newPageSlider.continuous=YES;
newPageSlider.minimumValue=1;
newPageSlider.maximumValue=totalPages;

thumbnailFrame = CGRectMake(0, 25, 120, 150);
pageNumFieldFrame = CGRectMake(0, thumbnailFrame.size.height+10, thumbnailFrame.size.width, 50);
for(int i=1;i<totalPages;i++){
thumbnailView = [[UIView alloc] initWithFrame:thumbnailFrame];
thumbnailView.backgroundColor=[UIColor clearColor];
UIButton *thumbnail = [[UIButton alloc] initWithFrame:thumbnailFrame];
UILabel *pageNumField = [[UILabel alloc] initWithFrame:pageNumFieldFrame];
pageNumField.backgroundColor=[UIColor clearColor];
thumbnail.tag=i+1;
thumbnailView.tag=i+1;

id<PageDataSource> pd = [kbDataSource pageAtIndex:i];

thumbnailFrame = CGRectMake(thumbnailFrame.origin.x+150+10, thumbnailFrame.origin.y, 120, 150);
pageNumFieldFrame = CGRectMake(pageNumFieldFrame.origin.x+150+10, pageNumFieldFrame.origin.y, thumbnailFrame.size.width, 50);
[thumbnail setBackgroundImage:[pd thumbnailImageForPageNumber:i] forState:UIControlStateNormal];
pageNumField.text =[NSString stringWithFormat:@"Page %d",i];
pageNumField.textColor=[UIColor whiteColor];
[thumbnailContentView addSubview:thumbnailView];
[sliderScrollView addSubview:pageNumField];
[sliderScrollView addSubview:thumbnail];
[sliderScrollView addSubview:thumbnailView];
[sliderScrollView bringSubviewToFront:thumbnail];
[sliderScrollView bringSubviewToFront:pageNumField];
[self.view bringSubviewToFront:thumbnail];
[thumbnailView release];
[pageNumField release];
[thumbnail release];
[thumbnail addTarget:self action:@selector(navigateToPage:) forControlEvents:UIControlEventTouchUpInside];
[pool release];
}

}

最佳答案

对于通过NSThreadperformsSelectorInBackground:在新线程中执行的每个主要方法,您必须创建一个如下所示的自动释放池:

- (void)myBackgroundOperation
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

// Do some work.

// At the very end, release the pool.
[pool release];
}

另请参阅: Why is there no autorelease pool when I do performSelectorInBackground

但是对于您的任务,我建议您也研究 NSOperationQueue。例如,参见文章 Cocoa Tutorial: NSOperation and NSOperationQueue

关于iphone - 在iPad编程中使用多线程时出现问题(用于加载大量图像),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6226204/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com