【问题标题】:Leaking memory in iOS appiOS应用程序内存泄漏
【发布时间】:2014-07-03 15:25:56
【问题描述】:

我的 NavigationController 有两个控制器。当我去第二个控制器时,一切都很好。但是,当我返回第一个控制器然后再次返回第二个时,使用的内存量会增加(每次第二个控制器再次加载时,内存都会永久增长)。在处理重复加载的viewDidLoad 方法中,_loadServicesView_complexTableView_selectTypeCarView 等对象被设置为 nil,然后再次创建。为什么这些对象在从第二个控制器转换到第一个控制器时没有被销毁?另外,如果它们没有被销毁,为什么它们被设置为零?

下面是第二个控制器的相关代码:

@interface WCselectTypeViewController () <UITableViewDataSource, UITableViewDelegate>

@property (strong, nonatomic) WCloadServices       *loadServices; 

@property (strong, nonatomic) WCloadView           *loadServicesView;

@property (strong, nonatomic) WCselectTypeView     *selectTypeView;

@property (strong, nonatomic) WCcomplexTableView   *complexTableView;

@end

@implementation WCselectTypeViewController


- (void)loadView
{
     [super loadView];
}

- (void)viewDidLoad
{
     [super viewDidLoad];

     if (!_loadServicesView)
     {
         _loadServicesView = [[WCloadView alloc] init];
         [_loadServicesView setDelegate:self];
         [self.view addSubview:_loadServicesView];
     }

     if (!_complexTableView)
     {
         _complexTableView = [[WCcomplexTableView alloc] initWithViewConfig:[WCappConfig getViewConfig]];
         _complexTableView.alpha = 0;
         _complexTableView.delegate = self;
         _complexTableView.dataSource = self;
         [self.view addSubview:_complexTableView];
    }

     if (!_selectTypeView)
     {
         _selectTypeView = [[WCselectTypeCarView alloc] initWithViewConfig:[WCappConfig getViewConfig] andType:[[WCorderStored sharedStore] getType]];
         [_selectTypeCarView setDelegate:self];
         [self.view addSubview:_selectTypeView];
     }
 }

【问题讨论】:

  • 如何从一个控制器到另一个控制器再返回?是否使用故事板转场?您是否创建了一个转场以“返回”(错误)
  • 我不使用故事板或 xib。仅以编程方式创建的 UIView
  • 确保您的“代表”是“弱”而不是“强”。 “WCselectTypeViewController”将“WCloadView”的实例保持为“strong”,并且“WCloadView”“delegate”设置为“WCselectTypeViewController”。可能的保留周期。
  • 那么,你能回答我的问题吗?如何从一个控制器转到下一个控制器,然后返回?
  • 我去下一个控制器——WCselectTypeViewController *selectTypeViewController = [[WCselectTypeViewController alloc] init]; [self.navigationController pushViewController:selectTypeCarViewController 动画:YES];

标签: ios objective-c xcode memory


【解决方案1】:

我认为这是我遇到的相同(错误/)行为。更改 VC 会将它们放入堆栈;如果使用后退箭头,内存应该会减少,不是吗?

我使用 PageViewController 代替了导航控制器。

这是我的工作解决方案:

- (void)viewDidLoad
{
    [super viewDidLoad];


    // Create the data model
    _pageTitles = @[@"1", @"2", @"3", @"4", @"5"];
//    _pageImages = @[@"page1.png", @"page2.png", @"page3.png", @"page4.png"];

    // Create page view controller

    self.pageViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"PageViewController"];
    self.pageViewController.dataSource = self;

    PageContentViewController *startingViewController = [self viewControllerAtIndex:0];
    NSArray *viewControllers = @[startingViewController];
    [self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];

    // Change the size of page view controller
    self.pageViewController.view.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height - 30);

    [self addChildViewController:_pageViewController];
    [self.view addSubview:_pageViewController.view];
    [self.pageViewController didMoveToParentViewController:self];

}

- (PageContentViewController *)viewControllerAtIndex:(NSUInteger)index
{

    if (([self.pageTitles count] == 0) || (index >= [self.pageTitles count])) {
        return nil;
    }
    // Create a new view controller and pass suitable data.


//    pageContentViewController.imageFile = self.pageImages[index];

    PageContentViewController *pageContentViewController;
    if (index == 0){
        pageContentViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"DetailView1"];
        pageContentViewController.pageIndex = index;
    }
    else if (index == 1){
        pageContentViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"DetailView2"];
        pageContentViewController.pageIndex = index;
    }
    else if (index == 2){
        pageContentViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"DetailView3"];
        pageContentViewController.pageIndex = index;
    }
    else if (index == 3){
        pageContentViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"DetailView4"];
        pageContentViewController.pageIndex = index;
    }
    else if (index == 4){
        pageContentViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"DetailView4"];
        pageContentViewController.pageIndex = index;
    }

    return pageContentViewController;

}

【讨论】:

  • 我使用 _complexTableView、_loadServicesView 和 _selectTypeView 代替 xib 或 storyboard。
  • 不过我猜这个问题是一样的;您是否在导航控制器中启用了导航栏?如果是这样,应该有那个后退箭头;使用它,VC 会正确地被销毁,否则 VC 会被堆叠。这是我面临同样问题的问题:stackoverflow.com/questions/23846686/…
  • 我似乎猜到了根据您在 appDelegate 中的消息的错误我做 UIBarButtonItem * 到 backButtonItem = [by [UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStyleBordered target:self action:nil]; navigationController.navigationBar.topItem.backBarButtonItem = backButtonItem;但是注释掉了,问题没有解决
猜你喜欢
  • 2012-06-16
  • 1970-01-01
  • 1970-01-01
  • 2016-03-28
  • 2010-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多