代码之家  ›  专栏  ›  技术社区  ›  youareawaitress

在viewdidload()内部定义函数比在外部定义函数节省更多内存吗?

  •  3
  • youareawaitress  · 技术社区  · 7 年前

    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()
        }
    
    }
    
    4 回复  |  直到 7 年前
        1
  •  3
  •   Sergey Kalinichenko    7 年前

    使函数成为方法的局部函数会改变其作用域,但不会改变由此编译的代码的生存期。该类的方法也是如此:它们的二进制代码不是单独管理的,至少目前不是这样。不过,这并不是什么大问题,因为函数的可执行代码相对较小。

    这里重要的是函数名在其外部范围内不可见,让其他方法定义自己的函数名 setBackgroundColor() 与中定义的函数无关的函数 viewDidLoad

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

    这提高了可读性,因为函数定义就在使用它的地方。它还提高了可维护性,因为无论是谁在重构您的代码,都可以确定没有其他用途 setBackgroundColor 外部 viewDidLoad视图 .

    函数,如下所示:

    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = UIColor.green
    }
    
        2
  •  2
  •   Abizern    7 年前

    设置背景颜色,实际上,任何类型的视图配置,在 viewDidLoad 因为当调用该方法时,视图已在视图控制器生命周期中的一个方便点创建(尽管不一定显示)。如果您创建了视图控制器,然后调用 setBackgroundColor 方法 self.view 如果尚未创建视图,调用的一部分将导致立即创建视图。

    对于某些方法,例如视图控制器演示,这允许创建方法在不立即加载视图的情况下尽快返回,并保持UI的响应性。

    正是由于视图的延迟加载,UIViewController才具有 isViewLoaded

        3
  •  2
  •   Community CDub    4 年前

    我在你的代码中没有看到任何值得担心的内存问题。微观优化是软件开发中最大的时间浪费。但既然你问了, viewDidLoad 仅调用一次。来自苹果的 Work with View Controllers

    viewDidLoad() 在创建视图控制器内容视图(其视图层次结构的顶部)并从情节提要加载时调用。在调用此方法时,保证视图控制器出口具有有效值。使用此方法可以执行视图控制器所需的任何其他设置。

    通常,iOS呼叫 viewDidLoad()

        4
  •  2
  •   toddg Stefan Steinegger    7 年前

    我的猜测是,效率上的任何损失都值得获得可读性更强的代码。事实上,如果您将函数标记为 private

    Martin Fowler有一个 great article on function length 在这篇文章中,他说他有很多一行长的函数,因为它们使代码更容易理解。

    有些人担心短函数,因为他们担心函数调用的性能成本。在我年轻的时候,这偶尔是一个因素,但现在这种情况非常罕见。优化编译器通常可以更好地使用较短的函数,这些函数可以更容易地缓存。与以往一样,性能优化的一般准则才是最重要的。

    不确定他关于函数缓存的注释是否适用于Swift,但他也表示:

    什么 它正在做,然后你应该把它提取到一个函数中,然后用什么来命名这个函数。这样,当你再次阅读它时,函数的目的就跳出来了

    YAGNI

    …正如代码所述,是的 ViewDidLoad() 只调用一次。