2017-08-07 29 views
3

由于viewdidload()仅在UIViewController对象的实例的生命周期中被调用一次,是否意味着下面的这个例子是一个“不好的做法”,因为setBackgroundColor()是一个只调用一次的函数,无需加载当它真的应该完全存在(定义和调用)在viewdidload()内部时,它们进入整个类的内存中?或者就效率而言,setBackgroundColor()是在哪里定义和调用的?定义函数里面的viewdidload()比外部定义它们更节省内存吗?

class MasterViewController: UIViewController { 

    func setBackgroundColor() { 
     self.view.backgroundColor = UIColor.green 
    } 

    // Do any additional setup after loading the view, typically from a nib. 
    override func viewDidLoad() { 
     super.viewDidLoad() 

     setBackgroundColor() 

    } 

    // Dispose of any resources that can be recreated. 
    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
    } 

} 

回答

2

这不是内存使用的情况下,它的有效负载的观点的问题。

UIViewControllers控制视图。但视图不是与视图控制器同时创建的。

viewDidLoad中设置背景颜色的确是任何视图配置,因为调用该方法时,视图已在视图控制器生命周期中的一个方便点创建(尽管未必显示)。如果你创建了视图控制器,然后调用你的方法,调用的self.view部分将导致视图直接创建,如果它尚未被创建。

对于某些方法(如视图控制器演示),这允许创建方法尽可能快地返回,而不会立即加载视图并保持UI的响应。

这是因为UIViewController具有isViewLoaded参数的延迟加载,该参数返回一个布尔值,判断视图是否加载到内存中,但不会导致视图加载。

2

我在代码中没有看到任何可以保证内存的问题。微型优化是软件开发中最大的浪费时间。但是既然你问了,viewDidLoad只被调用一次。从苹果公司的Work with View Controllers

创建和故事板加载视图控制器的内容视图(其视图层次结构的顶部)时viewDidLoad() -Called。视图控制器的插座在调用此方法时保证具有有效值。使用此方法执行视图控制器所需的任何其他设置。

通常情况下,iOS只在第一次创建内容视图时调用viewDidLoad()一次;但是,当控制器第一次实例化时,不一定会创建内容视图。相反,它在系统或任何代码第一次访问控制器的视图属性时被延迟创建。

+0

该文档称“使用此方法执行视图控制器所需的任何其他设置”,但将背景色设置为“附加设置”?它不是主要的,基础设置? func在不在viewdidload()内部时不加载,这导致我相信“附加设置”的措辞有点误导。是? –

+0

认识到viewController与视图不同是很重要的。您正在设置视图的颜色,它是viewController设置的一部分。 – toddg

3

对一个方法进行本地化的函数改变了它的范围,但不是它编译的代码的生命周期。类的方法也一样:它们的二进制代码不是单独管理的,至少目前不是。不过,这并不是什么大问题,因为你的函数的可执行代码相对较小。

这里重要的是,该功能的名称不是在其外部范围可见,让其他方法定义无关自己setBackgroundColor()功能内viewDidLoad定义的:

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Nested function definition 
    func setBackgroundColor() { 
     self.view.backgroundColor = UIColor.green 
    } 
    // Calling nested function 
    setBackgroundColor() 
} 

这提高了可读性,因为函数定义就在它的使用点。它还提高了可维护性,因为重构代码的人可以确定viewDidLoad之外不可以有其他用途setBackgroundColor

当然,这只是一个例子。嵌套函数是没有必要在这里 - 你可以重写它没有setBackgroundColor功能,如:

override func viewDidLoad() { 
    super.viewDidLoad() 
    self.view.backgroundColor = UIColor.green 
} 
2

我的猜测是,任何效率损失都值得获得更多可读代码。实际上,如果将其标记为private,则编译器优化甚至可能内联该函数。我对Swift编译器(LLVM)知之甚少,不知道它是否属实。

Martin Fowler有一个great article on function length其中他说,他有很多函数只是一行,只是因为它们使代码更容易理解。

有些人担心短功能,因为他们担心函数调用的性能成本。当我还年轻的时候,这有时候是一个因素,但现在非常罕见。优化编译器通常可以使用更短的函数更好地工作,这些函数可以更容易地缓存。一如既往,关于性能优化的一般准则是重中之重。

不知道他对功能缓存说明适用于斯威夫特,但他也说:

如果你不得不花费精力投入到寻找的代码片段,以找出它做什么 ,那么你应该把它提取到一个函数中,然后在那个“what”之后命名该函数。这样,当你再次阅读时,功能的目的就在你身上跳跃

一般来说,除非你注意到这是一个问题,否则我不会过多地关注优化。 YAGNI

...而作为代码不同的是,ViewDidLoad()是只调用一次。

相关问题