2010-06-07 3 views
2

У меня есть следующая проблема: в одном потоке выполнения я использую 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]; 

ответ

10

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

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

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

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

2

Вместо:

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

Do:

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

Или, наоборот, установите alloc'd для автоопределения. –

2

imageNamed возвращает autoreeased объект. Вы можете только освободить объект, на который у вас есть права собственности.

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

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


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

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

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

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

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

Смежные вопросы

 Смежные вопросы