内存警告后,递归调用中的UISpliviewcontroller失败

时间:2011-03-09 16:05:36

标签: objective-c ipad memory-management uinavigationcontroller uisplitviewcontroller

任何帮助表示赞赏!这几天我没有结果。

情景:

我和iPad应用程序有一个SplitViewController,显示2个controllersViews(左边是Root,右边是Detail)

Root允许递归导航(可能是几个向下钻取级别的树),并且每次在控制器堆栈中始终推送相同的控制器类(UITableView)时,我都会调用它。当用户点击一个单元格(左侧)时,详细视图(右侧)显示该信息。 请记住,详细视图控制器并不总是相同的类:它意味着我根据我必须显示的信息类型以编程方式分配(并释放)几个detailView控制器。

这里是片段:

UIViewController <ItemGenericViewController> *newDetailViewController = [[NSClassFromString(cntrClass) alloc] initWithNibName:cntrXib bundle:nil];

//the detailViewController has been defined in the head section as ItemGenericViewController

//each detailViewController is a subclass of ItemGenericViewController

detailViewController = newDetailViewController;
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:detailViewController];

// Update the split view controller's view controllers array.

NSArray *viewControllers = [[NSArray alloc] initWithObjects:self.navigationController, nav, nil];
self.splitViewController.viewControllers = viewControllers;
[nav release];
[viewControllers release];
[detailViewController release];

一切正常,直到出现记忆警告。

从那一刻起,如果我尝试显示一个新的detailViewcontroller,在SplitConController中,RootController和detailController之间的“连接”似乎消失了。结果是:splitController的右侧没有任何内容。 同时,如果我在根控制器中导航到父级别,情况仍然失败。

每次我在堆栈中推送一个新的RootController实例(左列)我都会释放相同的控制器(为了节省内存)我怀疑,在收到内存警告后,iOS正试图释放本身的记忆和我的“历史”也通过分裂控制器消失了相关的连接。

是一场噩梦; - )

你有什么建议吗?

谢谢

的Dario

1 个答案:

答案 0 :(得分:1)

我遇到了类似的问题(可能更糟 - 可能的视图切换的16种组合)......但我相信我现在已经解决了。

所以,我相信你已经使用了Apple的视图切换示例(我有修改),如果你有这样的话,问题是“root”splitViewController(来自MainWindow.xib)获得“niled”作为默认行为记忆警告。即使您向其添加新的视图控制器阵列,也不会导致任何更改(更糟糕的是,它不会显示任何警告信号)。解决方案是检查它是否为零,如果是,则重新初始化它。

这里是代码,使用上面的例子:

 UIViewController <ItemGenericViewController> *newDetailViewController =  [[NSClassFromString(cntrClass) alloc] initWithNibName:cntrXib bundle:nil];

//the detailViewController has been defined in the head section as ItemGenericViewController

//each detailViewController is a subclass of ItemGenericViewController

detailViewController = newDetailViewController;
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:detailViewController];

// Update the split view controller's view controllers array.

NSArray *viewControllers = [[NSArray alloc] initWithObjects:self.navigationController, nav, nil];

/**** Milos Edit ****/
if (self.splitViewController == nil) {
    // I'm keeping reference in app delegate, but any way to reinitialize splitViewController is OK
    self.splitViewController = delegate.splitViewController;
}
/**** end of edit ****/
self.splitViewController.viewControllers = viewControllers;
[nav release];
[viewControllers release];
[detailViewController release];

希望它会有所帮助。

干杯

米洛斯