下载图像时出现iphone内存问题

时间:2013-03-08 08:50:46

标签: iphone objective-c memory uiscrollview delegates

我有一个奇怪的问题。要求是在刷卡上从网址下载图像并在图像视图中显示它。它工作正常,但是在30张图像之后以及几次刷卡应用程序崩溃后我收到内存警告。

实施非常简单,但已花了将近2天的时间才弄明白问题。 在每次滑动时,我称之为方法: -

-(void)callDownloadImageAPI{

    NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];
    [self loadIndicator:@"Please Wait.!!" :@"Please be patient while we are downloading image for you"];
    @try{
        DownloadImage *downLoadImge =[[DownloadImage alloc] init];
        downLoadImge.delegate=self;
        [downLoadImge getImage:[self.allUrlArray objectAtIndex:self.initialImageViewCounter]];
    }
    @catch (NSException *e) {
        NSLog(@"callDownloadImageAPI exception %@",[e description]);
        [HUD hide:YES];        
    }
    [pool release];
}

此方法一次下载1张图像并将UIImage发送给其代理

// DownloadImage.h和.m

的实现
    @protocol DownloadImageDelegate
    @required
    - (void)messageFormServerWithImage:(UIImage*)imageFromSever;
    - (void)gettingImageFailed :(NSString*)errorDesc;
    @end



        @interface DownloadImage : NSObject

        @property(strong) NSURLConnection*                       connection;
        @property(weak) id<DownloadImageDelegate>                delegate;
        @property(strong) NSMutableData*                         data;

        -(void)getImage:(NSString *)imageUrl;

// DownloadImage.m

-(void)getImage:(NSString *)imageUrl{
    @autoreleasepool {

        [[NSURLCache sharedURLCache] removeAllCachedResponses];
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:imageUrl]cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:60];
    self.connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];

    }
}

- (void)connectionDidFinishLoading:(NSURLConnection*)theConnection {
    @autoreleasepool {

    NSLog(@"connectionDidFinishLoading");
    self.connection=nil;
    if( self.data == nil) {
        return;
    }

//  NSString* jsonStr = [[NSString alloc] initWithData:self.data encoding:NSASCIIStringEncoding];
    UIImage *img=[UIImage imageWithData:self.data];
//  NSArray *messages_json = [parser objectWithString:jsonStr error:nil];
    [self.delegate messageFormServerWithImage:img];
    self.data = nil;
    img= nil;
    }
}

NSUrlConnections的其他代表已经实施,但我没有把它放在这里。 返回此图像后,我将此图像设置为scrollview并显示它并从scrollview中删除上一个图像。

更多信息: -

只是为了验证我将设置图像注释到scrollview并在每次滑动时下载了图像但仍然会在30张图像周围崩溃

令人惊讶的是,我使用相同的类DownloadImage.h和.m在同一作品的其他地方下载图像,即使使用500images也能正常工作。

我正在测试iPod Touch,我检查了使用的内存保持在12-14mb之间(绝不超过这个)

请帮帮我们,让我知道你是否需要更多细节。

1 个答案:

答案 0 :(得分:1)

由于所有图像都存储在虚拟内存中,因此崩溃,您需要缓存它们,然后在用户实际查看它们时将它们加载回内存。

尝试在缓存或不需要后将图像对象设置为nil。

在你的课程中,我还建议使用didReceiveMemoryWarning方法,并在调用时从内存中释放一些图像。