She*_*eni 1 iphone singleton design-patterns objective-c ios
我想问一个关于良好代码实践和MVC模型的理论问题,以下是这种情况:
该设计包含一个RootViewController和一个单例类.单例充当控制器,具有应在整个应用程序中可用的计时器对象.计时器对象由UISwitch和NSTimer组成,它们都由单例控制器拥有,因此可以根据需要将UISwitch添加到新的viewControllers,并且可以在整个应用程序中访问计时器对象.
为了使用当前计时器的计数更新RootViewController的屏幕,我在RootViewController的单例中创建了一个指针,并让RootViewController将自己设置为该指针,类似于[singeltonOBject setDelegate:self].使用此设计,当计时器滴答时,可以从单例访问和更新RootViewController的UILabel.我选择这样做是因为我没有时间实施常规代表.
请注意,RootViewController由AppDelegate拥有,单例类显然不归RootViewController所有.因此没有保留周期.
问题:从单例到RootViewController的指针设置和从单例控制器更新UILable是否违反了良好的编码习惯,是否有任何基本原则未得到满足?
感谢您的回答!
一般来说,当事情感觉不对时,那是因为事实并非如此.
虽然您的代码可以正常工作,但未来维护起来并不容易,并且容易破解.即使您再也没有计划再次查看此代码,但实践良好的编码约定总是好的.
我建议阅读The Pragmatic Programmer,其中包含许多程序员如何编写更好代码的技巧.其中一个技巧是最小化模块之间的耦合.现在你的RootViewController知道你的Singleton,你的Singleton知道你的RootViewController,所以它们都相互耦合.在将来,当你改变一个时,你可能也需要改变另一个.
如果您想添加其他标签怎么办? 您必须在RootViewController中添加标签,然后更改您的单例以更新该标签.
如果你完全删除标签怎么办?让我们说你在几年后回到这个并删除标签,突然有另一个类没有编译,你可能不记得为什么.您在应用程序的完全独立部分中破坏了代码.
至于跟随MVC,这违反了这一点.您的视图正在被单独的东西修改.如果MVC设置正确,您应该可以根据需要添加任意数量的视图,而无需更改任何控制数据的代码,在本例中是您的计时器.
现在,就内存管理而言,这个Singleton现在保留了RootViewController.Singleton存在于应用程序的整个生命周期中.你是对的,你在技术上没有保留周期,但你的RootViewController现在永远不会被释放.在大多数应用程序中,这并不重要,因为RootViewController始终保持在堆栈的底部,但它是巧合,因此无法可靠地编程.这实际上是实用程序员的另一个提示,不要巧合.
一个更好的解决方案是使用通知,如果你真的需要像你说的全局计时器(另一个故事是你的全局计时器单身听起来不是一个好主意).每当您从单身内部更新标签时,您都可以发出通知.您的RootViewController将收到此通知并可以更新其标签.如果需要,您可以在通知中传递数据.现在将来,如果您对视图进行更改并希望更新其他内容,则只需在一个位置更改代码(RootViewController).
| 归档时间: | 
 | 
| 查看次数: | 132 次 | 
| 最近记录: |