2

マスター VC が読み込まれ (UITableViewController)、テーブル セルが押されると、詳細 VC (2 つの UIWebViews を持つ UIViewController) が作成される UISplitViewController を使用しています。


@implementation MasterVC

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    UIViewController  *detailViewController = nil;
    DetailVC *newDetailViewController = [[DetailVC alloc] initWithNibName:@"DetailVC" bundle:nil];
    detailViewController = newDetailViewController;

    // Update the split view controller's view controllers array.
    NSArray *viewControllers = [[NSArray alloc] initWithObjects:self.navigationController, detailViewController, nil];
    splitViewController.viewControllers = viewControllers;
    [viewControllers release];

    [detailViewController release];
}

メモリ警告をシミュレートすると、DetailVC が解放されます (didReceiveMemoryWarning、viewDidUnload、dealloc が呼び出されます) が、viewController を解放する MasterVC の行で、"-[UIView _invalidateSubviewCache]: message sent to deallocated instance" エラーが発生します。メモリ警告のために解放された detailViewController (DetailVC) をロードしようとするため、理にかなっています。ビューが表示されているため、なぜ詳細VCを解放する必要があるのか​​ 、私は完全には理解していません。

ここで、detailViewController を didSelectRowAtIndexPath 内で解放する代わりに、viewWillDisappear 内で解放すると、すべて正常に動作します。


@implementation MasterVC

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    UIViewController  *detailViewController = nil;
    DetailVC *newDetailViewController = [[DetailVC alloc] initWithNibName:@"DetailVC" bundle:nil];
    detailViewController = newDetailViewController;

    // Update the split view controller's view controllers array.
    NSArray *viewControllers = [[NSArray alloc] initWithObjects:self.navigationController, detailViewController, nil];
    splitViewController.viewControllers = viewControllers;
    [viewControllers release];

    // Released in viewWillDissapear   
    //[detailViewController release];
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];

    MyAppDelegate *delegate = [[UIApplication sharedApplication] delegate];
    // Retrieve the detail vc and release it-[UIView _invalidateSubviewCache]: message sent to deallocated instance
    [[delegate.splitViewController.viewControllers objectAtIndex:1] release];
}

私にとっては、マスターView Controllerが消えたときに詳細View Controllerを解放することは(ある程度)理にかなっていますが、それでもハックのように思えます(さらに、静的アナライザーは「右側」で詳細VCを解放しないと不平を言います場所)。これを解決する他のより良い方法はありますか?

4

0 に答える 0