UIView子类,在加载之前发布了吗?

时间:2012-03-03 23:12:38

标签: objective-c uiview release layer

我正在尝试使用:

显示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

我在调试中发现,调用OTChatMessageBox对象的dealloc方法只是结束了这个方法。

如果我删除对象的释放,一切正常......漏洞很大......

我查看了OTChatMessageBox的init方法并且非常简单,只有textView对象和带通知调用的按钮。

我缺少什么?

提前致谢;)

- 编辑 -

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

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

        [txtMessage becomeFirstResponder];
    }

    return self;
}

1 个答案:

答案 0 :(得分:1)

loadNibNamed:会返回autorelease'd NSArray个对象。因此,当您从OTChatMessageBox获取autorelease时,alloc/initrelease。这意味着您的结尾init导致过度发布。问题是self = [super init];方法应该返回一个对象,预期调用者将拥有该对象。

alloc是一个内存泄漏,因为你从不使用返回的对象而你没有释放它,因为你已经self = [super init]; [self release]; ... grab stuff from nib 已经应该释放它了。在这种情况下,你需要像

这样的东西
alloc/init

这当然是一个不必要的{{1}},你可能希望重新思考你是如何做到这一点