Кажется, я не могу перераспределить выпущенный UIView - PullRequest
0 голосов
/ 08 февраля 2010

У меня есть UIView, который я создаю программно примерно так:

@implementation SlideShowView
- (id)initWithImages
{
    …
    if (self=[super initWithFrame:CGRectMake(0, 0, 320, 480)])
    {
        // init objects here
    }
    return self;
}
- (void)dealloc
{
    printf("dealloc slide show view\n");
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"unlockUI" object:nil ];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"setUserRating" object:nil ];
    [mCurrentImageView release];
    [mRightImageView release];
    [mLeftImageView release];
    [mImages release];
    [queue cancelAllOperations];
    [queue release];
    [managingArray release];
    [super dealloc];
}

с контроллером uiview, который содержит это:

- (void)loadView {
{
    ...
    self.view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];
    self.slideShowViewObject = [[SlideShowView alloc] initWithImages];
    [self.view addSubview:slideShowViewObject];
    …
}
-(void)dealloc
{
    [slideShowViewObject release];
    [self.slideShowViewObject removeFromSuperview];
    printf("dealloc of slideshow view controller\n");
    [super dealloc];
}

это похоже на возможность освобождения и контроллера представления, и представления, но когда я помещаю этот контроллер представления обратно в стек, я получаю сообщение с включенным зомби: - [SlideShowView retain]: сообщение отправлено на освобожденный экземпляр 0x43ab160

Должен ли alloc не создавать новый экземпляр представления при нажатии контроллера? Я не понимаю, и, потратив много часов на чтение других постов, а также на просмотр руководств по памяти, я бы сказал, что я полностью озадачен! Может кто-нибудь предложить какие-нибудь указатели? Я только опубликовал код, который я счел необходимым, но я могу опубликовать больше, если это будет необходимо. Большое спасибо!

Ответы [ 2 ]

1 голос
/ 08 февраля 2010

Во-первых, вы не должны вызывать оба [super init] и [super initWithFrame:], только один из двух в вашем подклассе UIView.

Во-вторых, вы должны установить self.view только в контроллере представления в методе -loadView, который предназначен для создания ваших представлений. Обычно, если вам не нужно выполнять определенные типы настройки, такие как инициализация переменных и т. Д., Вам не нужно переопределять -init в подклассах UIViewController.

0 голосов
/ 09 февраля 2010

наконец, после того, как сегодня вечером я снова принялся за код, я наконец заработал. Ключевой элемент, который я не выпускал, кажется

[self.view release];

Полагаю, в этом есть смысл, так как я добавлял представление как подпредставление этого собственного представления alloc, но я пробовал это раньше. Возможно, очистка кода заставила его работать на этот раз.

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