iOS内存效率和性能:通过Segue传递数据还是创建新实例



我试图理解为什么一个选项在内存效率和性能方面会比另一个更好。

目前我有3个UIViewController类和一个NSObject类。

流程为ViewControllerOne->ViewControllerTwo->ViewControllerThreeNSObject实例仅在ViewControllerOneViewControllerThree中使用。

为了简单起见,类定义如下:

class MyClass: NSObject
{
override init()
{
super.init()
print("SUPER INIT")
}
}
class ViewControllerOne: UIViewController
{
var myClass = MyClass()
override func viewDidLoad()
{
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?)
{
if segue.identifier == "ViewControllerTwoSegue"
{
if let viewControllerTwo = segue.destination as? ViewControllerTwo
{
viewControllerTwo.myClass = myClass
}
}
}
}
class ViewControllerTwo: UIViewController
{
// Not being used
var myClass: MyClass?
override func viewDidLoad()
{
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?)
{
if segue.identifier == "ViewControllerThreeSegue"
{
if let viewControllerThree = segue.destination as? ViewControllerThree
{
viewControllerThree.myClass = myClass
}
}
}
}
class ViewControllerThree: UIViewController
{
// Being used
var myClass: MyClass?
override func viewDidLoad()
{
}
}

目前在我的应用程序中,我正在通过中间人ViewControllerTwo将对ViewControllerOne中包含的MyClass实例的引用传递给ViewControllerThree

在内存管理和效率方面,我认为与在ViewControllerThree中创建一个新的MyClass实例并在ViewControllerTwo中删除未使用的实例相比没有太大区别,即使它创建了两个MyClass实例:

class ViewControllerTwo: UIViewController
{
// Not being used
//        var myClass: MyClass?
override func viewDidLoad()
{
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?)
{
if segue.identifier == "ViewControllerThreeSegue"
{
if let viewControllerThree = segue.destination as? ViewControllerThree
{
//                    viewControllerThree.myClass = myClass
}
}
}
}
class ViewControllerThree: UIViewController
{
// Being used
var myClass = MyClass()
override func viewDidLoad()
{
}
}

我想遵循正确的编码标准,并想知道我是否应该选择其中一个,以确保我的应用程序优化到最佳运行状态?

谢谢。

我想遵循正确的编码标准,并想知道我是否应该支持其中一个,以确保我的应用程序经过优化以运行最好的时候?

这里没有适用的标准,真的,我认为这个决定应该纯粹是功能性的。

  • 您从哪里获取MyClass实例将持有的数据
  • 你需要哪个控制器(看起来像第三个)
  • 如果您从第三个控制器返回第二个控制器,然后再返回,您需要数据保持一致吗
  • 除了第一个控制器,还有其他入口点吗?(如深度链接)
  • 等等

有利于初始实现的处理和内存使用略有不同(1个alloc&init与可能的多个alloc/init/delloc),但这没有任何影响,也不应该影响应用程序的设计/实现方式。

您提出的两个行动方案之间没有显著差异。要了解原因,你必须知道什么是故事板。

故事板是实例的来源;制作视图控制器实例就是它所做的。向情节提要(无论是显式还是隐式)请求视图控制器,只是实例化该视图控制器类的另一种方式。

因此,说ViewControllerThree()和说"嘿,故事板,请递给我一个ViewControllerThree实例"之间没有显著差异——这就是触发片段所说的。

你可能会有一个心理画面,故事板上充满了视图控制器,所以仅仅拥有或加载一个故事板就会以某种方式同时存在所有这些视图控制器。但事实并非如此。故事板上充满了笔尖——每个场景一个视图控制器笔尖和一个视图笔尖——而在主动需要之前,这些笔尖中没有一个被加载。

因此,比起纯代码,更喜欢故事板的原因只是为了方便设计故事板中的所有内容(视图及其配置、片段等)。这可以显著地澄清您的代码(尽管这不一定会减少代码)。喜欢代码而不是故事板的原因是,比如说,你不喜欢prepare(for:sender:)的间接性质——你想自己实例化和配置下一个视图控制器,所有这些都是一次性的。

我自己的应用程序在使用故事板和不使用故事板之间大约各占一半。但在任何情况下,选择都与"内存效率和性能"无关

最新更新