Как освободить объект, объявленный в методе и переданный другому методу? - PullRequest
0 голосов
/ 15 сентября 2011

Любая идея о том, как выпустить объект UIImage изображение в этом случае:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{

    UIImage *payload = [[UIImage alloc] initWithData:self.activeDownload];
    UIImage *picture = [[UIImage alloc] init];
    if (payload.size.width != kAppIconHeight && payload.size.height != kAppIconHeight)
    {
        CGSize itemSize = CGSizeMake(kAppIconHeight, kAppIconHeight);
        UIGraphicsBeginImageContext(itemSize);
        CGRect imageRect = CGRectMake(0.0, 0.0, itemSize.width, itemSize.height);
        [payload drawInRect:imageRect];
        picture = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
    }
    else
    {
        picture = payload;
    }

    self.activeDownload = nil;
    [payload release];

    self.imageConnection = nil;

    [delegate ThumbDidLoad:self.indexPathInTableView Image:picture];
}

Спасибо за помощь,

Стефан

Ответы [ 3 ]

2 голосов
/ 15 сентября 2011

Нужно сделать авто-релиз

UIImage *picture = [[[UIImage alloc] init]autorelease];
1 голос
/ 15 сентября 2011

Мне трудно понять, почему у вашей переменной "picture" есть выделение init. Я согласен с более ранними ответами использовать autorelease, но, возможно, что-то вроде:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{

    UIImage *payload = [UIImage imageWithData:self.activeDownload];
    UIImage *picture = nil;
    if (payload.size.width != kAppIconHeight && payload.size.height != kAppIconHeight)
    {
        CGSize itemSize = CGSizeMake(kAppIconHeight, kAppIconHeight);
        UIGraphicsBeginImageContext(itemSize);
        CGRect imageRect = CGRectMake(0.0, 0.0, itemSize.width, itemSize.height);
        [payload drawInRect:imageRect];
        picture = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
    }
    else
    {
        picture = payload;
    }

    self.activeDownload = nil;    
    self.imageConnection = nil;

    [delegate ThumbDidLoad:self.indexPathInTableView Image:picture];
}

Пара изменений выше:

1. UIImage *payload = [UIImage imageWithData:self.activeDownload];. Изменено это назначение для объекта с автоматическим освобождением, поскольку ему может быть назначено изображение Обратите внимание, что предложение if назначает picture объекту с автоматическим освобождением, поэтому предложение else также должно применяться, и теперь оно выполняется, поскольку полезная нагрузка теперь является объектом с автоматическим освобождением.
2. UIImage *picture = nil; вместо UIImage *picture = [[UIImage alloc] init];. Я сделал это, так как назначение изображения НИКОГДА не используется, поэтому nil действительно действителен, поскольку он определенно будет назначен либо в предложении if, либо else.
3. Нет необходимости в [payload release] теперь, когда payload автоматически выпущен.

1 голос
/ 15 сентября 2011

Я думаю: [делегат ThumbDidLoad: self.indexPathInTableView Изображение: [автозагрузка изображения]];

или

 [delegate ThumbDidLoad:self.indexPathInTableView Image:picture];
 [picture release];

Но я вижу две проблемы в вашем коде - утечки на картинке = полезная нагрузка; и [выпуск полезной нагрузки]; может выпустить изображение, что также указано на картинке

...