Подкласс UIView, выпущенный прежде, чем загрузить это? - PullRequest
1 голос
/ 04 марта 2012

Я пытаюсь показать подкласс UIView с:

-(void)pushChatNewMessage:(id)sender
{
    NSNotification *not = (NSNotification *)sender;
    NSNumber *num = (NSNumber *)not.object;


    OTChatMessageBox *chatMessageBox = [[OTChatMessageBox alloc] init];

    chatMessageBox.frame = CGRectMake(123, 60, 778, 208);

    chatMessageBox.toId = [num intValue];

    [UIView beginAnimations:@"animationChatBox" context:nil];
    [UIView setAnimationDuration:0.5];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationTransition:UIViewAnimationTransitionCurlDown forView:chatMessageBox cache:YES];

    [self.view addSubview:chatMessageBox];

    [UIView commitAnimations];

    [chatMessageBox release];

}

Проблема в том, что я получаю эту ошибку:

modifiying layer that is being finalized

Я заметил в отладке, что метод dealloc объекта OTChatMessageBox просто завершает этот метод.

Если убрать выпуск объекта, все работает нормально ... с большой утечкой ...

Я рассмотрел метод init OTChatMessageBox и он абсолютно прост, только объект textView и кнопка с вызовом уведомления.

Чего мне не хватает?

Заранее спасибо;)

- EDIT -

-(id)init
{
    self = [super init];

    if (self)
    {
        self = [[[NSBundle mainBundle] loadNibNamed:@"OTChatMessageBox" owner:self options:nil] objectAtIndex:0];

        [txtMessage becomeFirstResponder];
    }

    return self;
}

1 Ответ

1 голос
/ 04 марта 2012

loadNibNamed: возвращает autorelease 'd NSArray объектов. Поэтому ваш OTChatMessageBox равен autorelease d, когда вы получаете его от alloc/init. Это означает, что ваш конец release вызывает перевыпуск. Проблема заключается в том, что метод init должен возвращать объект, владельцем которого, как ожидается, станет владелец.

self = [super init]; - это утечка памяти, так как вы никогда не используете возвращенный объект и не освобождаете его, так как у вас есть alloc, который уже был необходим для освобождения объекта. В этом случае вам понадобится что-то вроде

self = [super init];
[self release];

... grab stuff from nib

Это, конечно, излишне alloc/init, и вы можете переосмыслить, как вы это делаете

...