开发者

Problem while using Multi - threading in iPad programming (for loading large number of images)

开发者 https://www.devze.com 2023-03-10 08:46 出处:网络
i am supposed to load large number of images on to a scrollview which, i suppose would take some time and memory. So, i used a separate thread to load these images in the background. I have used the f

i am supposed to load large number of images on to a scrollview which, i suppose would take some time and memory. So, i used a separate thread to load these images in the background. I have used the following multi threading method

[NSThread detachNewThreadSelector:@selector(prepareSliderView) toTarget:self withObject:nil];

to load the images on a separate thread. While implementing this method i am getting the following messages in my 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

I had no clue what this meant as i never executed this method before. So, my questions are

1 - should i use some autoRelease pool along with this method

2 - is there any other way in which i can load large number of images with out putting a lot of load the main thread

-(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];
}

}


For each main method that you execute in a new thread, either via NSThread or via performsSelectorInBackground:, you have to create an autorelease pool like this:

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

   // Do some work.

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

See also: Why is there no autorelease pool when I do performSelectorInBackground

But for your task I suggest you also look into the NSOperationQueue. See for example the article Cocoa Tutorial: NSOperation and NSOperationQueue.


As the documentation says:

the method aSelector is responsible for setting up an autorelease pool for the newly detached thread and freeing that pool before it exits

So, in your prepareSliderView method you need to create and release an autorelease pool:

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

// some work

[pool release];
0

精彩评论

暂无评论...
验证码 换一张
取 消