【问题标题】:UISpliviewcontroller in recursive calls fail after a memory warning内存警告后递归调用中的 UISpliviewcontroller 失败
【发布时间】:2011-03-09 16:05:36
【问题描述】:

任何帮助表示赞赏!这几天我都在战斗,没有结果。

场景:

我和 iPad 应用程序有一个 SplitViewController,它显示 2 个控制器视图(左侧为 Root,右侧为 Detail)

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

这里是片段:

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,SplitViewController 中 RootController 和 detailController 之间的“连接”似乎消失了。结果是:splitController 的右侧没有出现任何内容。 同时,如果我在根控制器中导航到父级,情况仍然失败。

为了您的信息,每次我在堆栈中推送一个新的 RootController 实例(左列)时,我都会释放相同的控制器(像往常一样节省内存),我怀疑在收到内存警告后,iOS 正在尝试释放自己的记忆和我的“历史”消失了,相关的联系也通过拆分控制器消失了。

是一场噩梦 ;-)

你有什么建议吗?

谢谢

达里奥

【问题讨论】:

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


    【解决方案1】:

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

    所以,我相信您已经使用 Apple 的示例进行视图切换(我有,并进行了修改),如果您有,问题是“根”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];
    

    希望对您有所帮助。

    干杯

    米洛斯

    【讨论】:

    • 如果您提供代码示例,我认为您的回答会更有帮助。
    • 当然,没问题(如您所见,第一次评论,所以...)。在这里,使用上面的代码:
    猜你喜欢
    • 1970-01-01
    • 2011-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多