NSAutoreleasePool и переменные класса - PullRequest
0 голосов
/ 03 октября 2011

Я получаю то, что выглядит как сбой из-за перевыпуска, но, насколько я могу судить, я не делаю ничего плохого, однако у меня может быть неправильное представление об AutoreleasePools и переменных класса.

ЕслиУ меня есть переменная класса:

UIImageView *imageView;

, и я размещаю ее в потоке примерно так:

 - (void)setupThreaded {
     NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

     UIImage *image = [UIImage imageNamed:@"myimage.png"];
     imageView = [[UIImageView alloc] initWithImage:image];

     [self performSelectorOnMainThread:@selector(addViewOnMainThread) withObject:nil waitUntilDone:YES];

     [pool release];
}

- (void)addViewOnMainThread {
    [self.view addSubView:imageView];
}

В настоящее время я иногда получаю сообщение об ошибке, указывающее, что либо imageView был выпущен преждевременно ИЛИизображение этого imageView выходит преждевременно.

Что может быть причиной этого?

1 Ответ

5 голосов
/ 03 октября 2011

Чрезвычайно необычно хранить представление в переменной класса. Почему ты это делаешь?

В общем случае запрещен доступ к UIView в фоновых потоках. Документы немного хитроумны относительно того, допустимо ли создание UIView в фоновом потоке, но как только вы погрузитесь в initWithImage:, это явно не поддерживается явно и, вероятно, не разрешено.

Если по какой-то причине вы создаете UIImage в фоновом потоке, это нормально, но затем просто передайте сам UIImage в основной поток и создайте представление там. Вам не нужна переменная класса для передачи ее между потоками. Просто передайте его как объект performSelectorOnMainThread:withObject.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...