Неверное уменьшение количества ссылок - PullRequest
2 голосов
/ 08 июня 2010

У меня следующая проблема: в одном потоке выполнения я использую alloc, а в другом потоке alloc не требуется.В конце оператора if я в любом случае освобождаю объект.Когда я делаю «строить и анализировать», я получаю сообщение об ошибке: «Неверное уменьшение счетчика ссылок объекта не принадлежит вызывающей стороне».

Как решить эту проблему?

UIImage *image; 

int RandomIndex = arc4random() % 10;

if (RandomIndex<5) 
{
    image = [[UIImage alloc] initWithContentsOfFile:@"dd"];
}
else 
{
    image = [UIImage imageNamed:@"dd"];
}


UIImageView *imageLabel =[[UIImageView alloc] initWithImage:image];
[image release];
[imageLabel release];

Ответы [ 4 ]

10 голосов
/ 08 июня 2010

Вы должны retain изображение во втором состоянии:

image = [[UIImage imageNamed:@"dd"] retain];

Таким образом, оба возможных выхода из условия будут иметь объект с количеством ссылок, равным единице, с вашей точки зрения.

В противном случае вы пытаетесь release уже autorelease d объект!

8 голосов
/ 08 июня 2010

Вы можете сделать то, что предложили другие, или:

if (RandomIndex<5) 
{
    image = [UIImage imageWithContentsOfFile:@"dd"];
}
else 
{
    image = [UIImage imageNamed:@"dd"];
}

UIImageView *imageLabel =[[UIImageView alloc] initWithImage:image];
...
[imageLabel release];

Таким образом, в обоих случаях вы получаете автоматически выпущенный объект image, который вам не нужно освобождать самостоятельно.

2 голосов
/ 08 июня 2010

imageNamed возвращает автоматически освобожденный объект.Вы можете освободить только объект, владельцем которого вы являетесь.

Это будет работать:

if (RandomIndex<5) 
{
    image = [[UIImage alloc] initWithContentsOfFile:@"dd"] autorelease];
}
else 
{
    image = [UIImage imageNamed:@"dd"];
}


UIImageView *imageLabel =[[UIImageView alloc] initWithImage:image];
[imageLabel release];
2 голосов
/ 08 июня 2010

Вместо:

image = [UIImage imageNamed:@"dd"];

Do:

image = [[UIImage imageNamed:@"dd"] retain];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...