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 であることを意味するため、オブジェクトはもう存在しません (ここでは単純化しています。サブビューとしても追加すると、保持カウントが増加します。しかし、ポイントは、ここでリリースする必要はありません)。

これは、view と _refreshHeadView の両方が同じ objectであるため、_refreshHeaderView も存在しないことも意味します。そのため、呼び出すrefreshLastUpdatedDateとアクセスが悪くなり、クラッシュします。

を取り除くと[view release]クラッシュは止まるはずですが、後でそのオブジェクトを使い終わったときに (おそらく dealloc メソッドで) そのオブジェクトを確実に解放するように細心の注意を払う必要があります。refreshHeaderViewこれに役立つプロパティを作成することをお勧めします。

于 2011-03-20T14:00:45.023 に答える