0

Xcode 4 告诉我它在这行代码上崩溃了:view.delegate = self;

- (void)viewDidLoad {
    [super viewDidLoad];
    self.navigationController.navigationBar.barStyle = UIBarStyleBlack;
    self.title = @"Blog";

    if (_refreshHeaderView == nil) {

        EGORefreshTableHeaderView *view = [[EGORefreshTableHeaderView alloc] initWithFrame:CGRectMake(0.0f, 0.0f - self.tableView.bounds.size.height, self.view.frame.size.width, self.tableView.bounds.size.height)];
        view.delegate = self;
        [self.tableView addSubview:view];
        _refreshHeaderView = view;
        [view release]; 
    }
    [_refreshHeaderView refreshLastUpdatedDate];
}

你知道它为什么会崩溃吗?

4

1 回答 1

0

你过度释放视图。您初始化view,然后将其分配给_refreshHeaderView,然后立即释放view

当你这样做时:

_refreshHeaderView = view;

...您告诉 _refreshHeaderView 指向view对应的内存位置。view保留计数为 1,因为您已分配/初始化它。然后在下一行你 release view,这意味着它的保留计数为 0,所以对象不再存在(我在这里简化:你也将它添加为子视图,这将增加保留计数。但关键是如果你不需要在这里发布)。

这也意味着 _refreshHeaderView 也不再存在,因为view 和 _refreshHeadView 都是同一个 object。因此,当您打电话时,refreshLastUpdatedDate您将获得错误的访问权限,并导致崩溃。

摆脱[view release]应该停止崩溃,但是您应该非常小心,以确保稍后在完成该对象后释放该对象(大概在您的 dealloc 方法中)。建议创建refreshHeaderView一个属性来帮助解决这个问题。

于 2011-03-20T14:00:45.023 回答