【问题标题】:Release ViewControllers Associated with UITabBarController with ARC使用 ARC 发布与 UITabBarController 关联的 ViewController
【发布时间】:2016-05-02 15:38:43
【问题描述】:

我正在使用具有以下结构的应用程序

-UINavigationController (MAIN NAVIGATION CONTROLLER)
--UIViewController
---UITabBarController
     -- UINavigationController1
     ---- UITableViewController1

     -- UINavigationController2
     ---- UITableViewController2

     -- UIViewController ( Logout Button is in this Controller )

现在我正在调用以下方法将用户注销到第一个 ViewController

[self.navigationController popToRootViewControllerAnimated:YES];

这里 self.navigationController = (主导航控制器)

但此代码不起作用,它不会在控制器下取消初始化。

-- UINavigationController1
---- UITableViewController1

-- UINavigationController2
---- UITableViewController2

我正在使用 ARC,所以我无法为所有控制器调用 release 方法,所以我该如何实现。

更新

这是我的推送代码:

//Property Declare in AppDelegate
@property (nonatomic,weak) UITabBarController *tabBarControllerRef;

// Below code Written in RootViewController of (MAIN NAVIGATION CONTROLLER)
-(void)moveToContentScreen { 
AppDelegate *delegateRef = (AppDelegate *) [UIApplication sharedApplication].delegate;
delegateRef.tabBarControllerRef = [self.storyboard instantiateViewControllerWithIdentifier:@"tabbarReference"];
if (delegateRef.tabBarControllerRef) {
    [self.navigationController pushViewController:delegateRef.tabBarControllerRef animated:YES];
}
}

【问题讨论】:

  • 标签控制器呢?是deinit吗?如果没有,你就有一个参考循环。

标签: ios objective-c uinavigationcontroller uitabbarcontroller dealloc


【解决方案1】:

几乎可以肯定的是,您有一个强大的参考周期;两个(或更多)对象在一个循环中都持有对其他对象的强引用,因此它们中的任何一个都不能被删除。例如,UITabBarController 是否对其封闭视图有强引用?如果是这样,请至少使其中一个引用变弱以打破循环。

如果通过查看哪些对象可能周期性地相互引用并不清楚,您可以使用 Instruments 尝试找到它们;有an excellent tutorial here,“强参考循环”部分几乎完全讨论了这类问题。

【讨论】:

  • 当我从 MainNavigationController 推送时,如何使 uitabbarcontroller 引用变弱
  • 当你推送它时,你是否将它分配给了一个属性?默认情况下它们很强大,因此属性声明需要很弱。向我们展示您用于将控制器推送到 self.navigationController 的代码,然后我们可能会看到问题所在。
  • 嗯。也许UITableViewController1UITableViewController2 相互引用?还是有其他对象持有对它们的引用?
  • nope...它与navigationcontroller 和navigationcontroller 连接到uitabbarcontroller 连接
  • 在 UITableViewController1 我有一些在后台工作的方法是停止视图控制器以释放?
【解决方案2】:

UIViewController 如何呈现UITabBarController?孩子/父母?如果是这样,看起来第一个 UIViewController 视图控制器仍然持有对 UITabBarController 的引用。从您的图表来看,最初的UINavigationController 似乎只有一个推送UIViewController,即根目录。

【讨论】:

  • 是否需要UITabBarController 的属性?使用UIApplicationDelegate 上的公共属性进行全局访问是不好的做法。尝试在本地创建 UITabBarController 并推送它。
  • UITabBarController *controllerRef = [self.storyboard instantiateViewControllerWithIdentifier:@"tabbarReference"]; if (controllerRef) { [self.navigationController pushViewController:controllerRef animated:YES]; }
猜你喜欢
  • 1970-01-01
  • 2020-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多