iOS NSURLConnection памяти утечка - PullRequest
0 голосов
/ 08 ноября 2011

Я получил такой код

#import "UIWebImageView.h"

@interface UIWebImageView (hiddenMethods)

- (void) initDefaults;

@end

@implementation UIWebImageView (hiddenMethods)

- (void) initDefaults
{
    self.showActivityIndicator = NO;
    self.activityIndicatorStyle = UIActivityIndicatorViewStyleWhite;
    self.activityIndicatorSize = CGSizeMake(20.0, 20.0);
    //data = [[NSMutableData alloc] init];
}

@end

@implementation UIWebImageView

@synthesize showActivityIndicator;
@synthesize activityIndicatorStyle;
@synthesize activityIndicatorSize;

- (id) init
{
    if (self = [super init])
    {
        [self initDefaults];
    }
    return self;
}

- (void) loadFromURL:(NSString *) url
{
    [self.image release];
    self.image = nil;
    request = [NSURLRequest requestWithURL:[NSURL URLWithString:url] 
                                             cachePolicy:NSURLRequestReturnCacheDataElseLoad
                                         timeoutInterval:30.0];

    if (connection == nil)
        connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];

    // activity indicator start
    indicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:activityIndicatorStyle];
    indicator.frame = CGRectMake((self.frame.size.width - activityIndicatorSize.width)/2, (self.frame.size.height - activityIndicatorSize.height)/2,
                                 activityIndicatorSize.width, activityIndicatorSize.height);

    [self addSubview:indicator];
    [indicator startAnimating];
}

- (void) dealloc
{
    [data release];
    [indicator release];
    [connection release];
    [super dealloc];
}

#pragma mark -
#pragma mark connection delegate

- (void) connection:(NSURLConnection *)theConnection didReceiveData:(NSData *)incrementalData 
{

    if (data == nil)
        data = [[NSMutableData alloc] initWithCapacity:2048];

    [data appendData:incrementalData];
}

- (void) connectionDidFinishLoading:(NSURLConnection *)theConnection 
{
    self.image = [UIImage imageWithData:data];

    [indicator removeFromSuperview];
    //data = nil;
    [data release], data = nil;
    [connection release], connection = nil;
    [indicator release], indicator = nil;
}

- (void) connection:(NSURLConnection *)theConnection didFailWithError:(NSError *)error
{
    self.image = [UIImage imageNamed:@"icon.jpg"];
    [indicator removeFromSuperview];
    //data = nil;
    [data release], data = nil;
    [connection release], connection = nil;
    [indicator release], indicator = nil;
}

Я использую его для загрузки изображений из Интернета.одно изображение для каждой ячейки в таблице.и он отлично работает, когда изображение не выходит за пределы экрана.НО, когда вы прокручиваете tableView быстро и некоторые изображения не заканчивают загружаться, пока они находятся на экране, возникают огромные утечки памяти.

Я знаю, где утечка и почему она протекает.но я не могу найти решение.Какие-нибудь мысли ?спасибо

PS извините за мой английский

ОБНОВЛЕНИЕ

вот код для добавления изображений в tableView

UIWebImageView *tmpImageView = [[UIWebImageView alloc] initWithFrame:CGRectMake(0, 0, 57, 76)];
    tmpImageView.showActivityIndicator = YES;
    tmpImageView.contentMode = UIViewContentModeScaleAspectFit;
    tmpImageView.activityIndicatorStyle = UIActivityIndicatorViewStyleGray;
    [tmpImageView loadFromURL:[[tableArray objectAtIndex:indexPath.row] objectForKey:@"picurl"]];
    [cell addSubview:tmpImageView];
    [tmpImageView release];

и я повторяюсь =) утечка только когда он не закончил загрузку и ушел с экрана при прокрутке

Ответы [ 2 ]

1 голос
/ 08 ноября 2011

Автосоединение вашего NSURLConnection с этим синтаксисом

connection = [NSURLConnection connectionWithRequest:request delegate:self];

и удалите [connection release], connection = nil;

1 голос
/ 08 ноября 2011

Утечки происходят из-за рекурсивного размещения объектов UIWebImageView (учитывая, что вы используете многократно используемые ячейки).

вы должны изменить свой код на:

    UIWebImageView *tmpImageView = [cell viewWithTag:2011];

    if(!tmpImageView)
    {
    tmpImageView = [[UIWebImageView alloc] initWithFrame:CGRectMake(0, 0, 57, 76)];
        tmpImageView.showActivityIndicator = YES;
        tmpImageView.tag = 2011;
        tmpImageView.contentMode = UIViewContentModeScaleAspectFit;
        tmpImageView.activityIndicatorStyle = UIActivityIndicatorViewStyleGray;
        [cell addSubview:tmpImageView];
        [tmpImageView release];
    }


        [tmpImageView loadFromURL:[[tableArray objectAtIndex:indexPath.row] objectForKey:@"picurl"]];

, с которыми вам нужно справитьсячто-то вроде showActivityIndicator ... на основе вашего кода, но вышеупомянутое изменение удалит ваши утечки памяти.

...