gpt4 book ai didi

ios - 覆盖 loadView 会导致 viewDidLoad 和 loadView 在每次出现 VC 时触发

转载 作者:行者123 更新时间:2023-11-28 22:36:58 36 4
gpt4 key购买 nike

我的 View 层次结构位于几个自定义“根”UIViewController 子类上。我正在尝试为我的根 VC 子类之一设置自定义 self.view。在那里,我正在做:

MyRootViewController_With_Scroll.h

// Import lowest level root VC
#import "MyRootViewController.h"
// my custom scroll view I want to use as self.view
@class MyScrollView;

@interface MyRootViewController_With_Scroll : MyRootViewController {

}

@property (strong) MyScrollView *view;

@end

MyRootViewController_With_Scroll.m

#import MyRootViewController_With_Scroll.h;

@interface MyRootViewController_With_Scroll ()

@end

@implementation MyRootViewController_With_Scroll

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}

- (void)loadView
{
NSLog(@"loading view");
CGRect windowSize = [UIScreen mainScreen].applicationFrame;
MyScrollView *rootScrollView = [MyScrollView scrollerWithSize:windowSize.size];
self.view = rootScrollView;

}

- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
}

- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}

// Getter and setter for self.view
- (MyScrollView *)view
{
return (MyScrollView *)[super view];
}
- (void)setView:(MyScrollView *)view
{
[super setView:view];
}

根据 iOS6 文档,viewDidLoad 在应用程序的整个生命周期中仅假设每个 View Controller 触发一次。

我在这里做错了什么?是什么导致我的视​​图 Controller 重复调用 loadView/viewDidLoad?奇怪的是,我的应用程序“主屏幕”VC 只加载一次 View ,但导航继承中的所有后续 View 每次出现时都会触发 loadView。这是怎么回事?

编辑 我已将属性更改为strong。发生同样的问题。

edit 2 我已经停止覆盖 loadView 并且它仍在发生。现在我真的很困惑。

最佳答案

这是预期的行为。如果您从导航堆栈中弹出 View Controller ,并且没有其他任何东西引用它们,那么它们将被释放。因此当它再次出现时,它将是一个新的实例,因此它必须重新执行 loadView 等等。在您的日志记录中包含 self,您应该看到它每次都是不同的对象。

您还将 View Controller 的 View 属性重新定义为 weak - 如果您 重新使用 View Controller 对象,那么它会尽快消失该 View 没有 super View 。

在 iOS 6 之前,位于导航堆栈中间的 View Controller 会在内存压力下卸载其 View :

root --> VC1 --> VC2

VC2 在屏幕上,收到内存警告。 VC1 将卸载它的 View 。当您从堆栈中弹出 VC2 时,VC1 将再次调用 loadView。这不再发生。

但是,如果您返回到 VC1,并且没有任何内容对 VC2 有强引用,则 VC2 将被释放。当您将另一个 VC2 插入堆栈时,这是一个新实例,并且将再次调用 loadView。假设您正在代码中创建这些 VC2 的新实例,因此您应该能够知道您正在创建一个新实例。

关于ios - 覆盖 loadView 会导致 viewDidLoad 和 loadView 在每次出现 VC 时触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15660608/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com