iOS内存效率和性能:通过Segue传递数据还是创建新实例?
我试图理解为什么一个选项在内存效率和性能方面比另一个更好 目前我有3个UIViewController类和一个NSObject类 流程为ViewControllerOne->ViewControllerTwo->ViewControllerThree。NSObject实例仅在ViewControllerOne和ViewControllerThree中使用 为简单起见,类的定义如下:iOS内存效率和性能:通过Segue传递数据还是创建新实例?,ios,swift,Ios,Swift,我试图理解为什么一个选项在内存效率和性能方面比另一个更好 目前我有3个UIViewController类和一个NSObject类 流程为ViewControllerOne->ViewControllerTwo->ViewControllerThree。NSObject实例仅在ViewControllerOne和ViewControllerThree中使用 为简单起见,类的定义如下: class MyClass: NSObject { override init() {
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
在内存管理和效率方面,与在ViewControllerTree中创建MyClass的新实例和在ViewControllerTwo中删除未使用的实例相比,我看不出有多大区别,即使它创建了MyClass的两个实例:
我想遵循正确的编码标准,并想知道我是否应该选择其中一个,以确保我的应用程序优化到最佳运行状态
谢谢。您提出的两种行动方案之间没有任何显著差异。要了解原因,你必须知道故事板是什么
故事板是实例的来源;创建视图控制器实例就是它所做的。向情节提要(显式或隐式)请求视图控制器只是实例化该视图控制器类的另一种方式
因此,说ViewControllerThree和说嘿,故事板,请给我一个ViewControllerThree实例之间没有显著的区别——触发segue就是这么说的
您可能会在脑海中想象到故事板上塞满了视图控制器,因此,仅仅拥有或加载一个故事板就会以某种方式使所有这些视图控制器同时存在。但事实并非如此。故事板上塞满了笔尖——每个场景一个视图控制器笔尖和一个视图笔尖——在需要时,甚至都不会加载这些笔尖
因此,与纯代码相比,更喜欢情节提要的原因很简单,就是为了方便在情节提要中设计所有视图及其配置、分段等。这可以极大地澄清您的代码,尽管它不一定会减少代码。与情节提要相比,您更喜欢代码的原因可能是,您不喜欢preparefor:sender的间接性质:-您希望自己实例化并配置下一个视图控制器,这一切都可以一蹴而就
我自己的应用程序在使用故事板和不使用故事板之间大约各占一半。但在任何情况下,选择都与内存效率和性能无关
我想遵循正确的编码标准,并想知道我是否
应该支持其中一个,以确保我的应用程序优化运行
处于最佳状态
这里没有适用的标准,我认为这个决定应该纯粹是功能性的
您从何处获取MyClass实例将保存的数据?
您需要哪个控制器?它看起来像是第三个控制器?
如果您从第三个控制器返回到第二个控制器,然后再返回,您是否需要数据保持一致?
除了第一个控制器,还有其他入口点吗?比如深度链接
等
在处理和内存使用方面,有利于您的初始实现1 alloc&init与可能的多个alloc/init/dealloc略有不同,但这并不重要,也不应影响您设计/实现应用程序的方式 谢谢你的解释,总之,你基本上是说,将在ViewControllerOne中创建的MyClass实例传递给ViewControllerThree与在ViewControllerThree中创建MyClass的新实例没有区别?数据不需要一致……我只关心多个类分别创建MyClass实例时的多个alloc/init仅仅在顶层创建一个实例并将其引用传递给子类……这不会有太大的区别吗?
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()
{
}
}