2010-02-08 1 views
0

У меня есть UIView, который я создаю программно примерно так:Не похоже, чтобы иметь возможность повторно Alloc отпущенном 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]; 
} 

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

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

ответ

1

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

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

+0

Благодарим вас за ответ. Я внес эти изменения в свой код, а также в сообщение выше. Тем не менее, у меня все еще есть одна и та же проблема. Возможно, у вас есть другие предложения? – Dobler

0

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

[self.view release]; 

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