热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

iOS:使用app委托来容纳全局变量-iOS:Usingtheappdelegatetohouseglobalvariables

IsitbadpractisetohousevariablesthatIwanttobeaccessiblefromallclassesintheappdeleg

Is it bad practise to house variables that I want to be accessible from all classes in the app delegate and get them via [[UIApplication sharedApplication] delegate] someProperty]

容纳我想要从app委托中的所有类访问的变量并通过[[UIApplication sharedApplication]委托] someProperty获取它们是不好的做法

2 个解决方案

#1


7  

The real solution to your question isn't to replace one form of global state with another (i.e. singletons).

你问题的真正解决方案不是将一种形式的全球状态替换为另一种形式(即单身人士)。

What you should be doing is putting state within "model" classes that are instantiated inside your app delegate, and then passing them down to the parts of your application that need them (e.g. view controllers), thereby eliminating your global state problem entirely.

您应该做的是将状态放在应用程序委托中实例化的“模型”类中,然后将它们传递给需要它们的应用程序部分(例如视图控制器),从而完全消除您的全局状态问题。

#2


3  

Its generally not a good practice to load up your AppDelegate as a container for app-wide variables in this way. It can quickly get unwieldy.

以这种方式将AppDelegate作为应用程序范围变量的容器加载通常不是一个好习惯。它很快就会变得笨拙。

A common practice is to define some singleton objects, as follows:

通常的做法是定义一些单例对象,如下所示:

+ (instancetype)shared
{
    static dispatch_once_t onceToken;
    static MyServiceClient* instance;

    dispatch_once(&onceToken, ^  //Use GCD to make a singleton with thread-safety
    {
        instance = [[self alloc] init];
    });
    return instance;
}

You can then provide these objects as parameters to your classes that require them as collaborators.

然后,您可以将这些对象作为参数提供给需要它们作为协作者的类。

Use Dependency Injection

使用依赖注入

Note though that singleton can be considered an anti-pattern. If you inject these singletons into classes that require them its not too bad, however it's definitely not recommend to hard-wire them (unfortunately, also a common practice), as this promotes too-tight coupling, cohesion and requires complicated swizzling in order perform unit tests.

请注意,单例可以被视为反模式。如果你将这些单体注入需要它们的类别并不太糟糕,但绝对不建议硬连线(不幸的是,这也是一种常见的做法),因为这会促进过于紧密的耦合,凝聚力并需要复杂的调配才能执行单元测试。

Another approach is to use dependency injection, in which case the objects need not even be singletons, in most cases. You can instantiate an object-graph of collaborating components for a given use-case that will come and go as needed. This has the benefit of using less memory on resource constrained devices.

另一种方法是使用依赖注入,在这种情况下,在大多数情况下,对象甚至不需要是单例。您可以根据需要实例化给定用例的协作组件的对象图。这样做的好处是可以在资源受限的设备上使用更少的内存。

Its a common misconception that you need a library to use dependency injection. You don't. It can help though. I created a dependency injection container called Typhoon.

它是一个常见的误解,你需要一个库来使用依赖注入。你没有。它可以帮助。我创建了一个名为Typhoon的依赖注入容器。

Notifications

Another way of achieving loose collaboration between classes is to use notifications.

在类之间实现松散协作的另一种方法是使用通知。


推荐阅读
  • 在 `UITableViewController` 中采用简洁的平面样式布局时,可以通过优化代码实现单元格扩展至屏幕边缘的效果,同时确保节标题以分组样式呈现,从而提升用户体验和界面美观度。通过这种方式,可以更好地组织和展示列表内容,使其更加清晰和有序。 ... [详细]
  • iOS 面试实战:15 道经典面试题及解析
    本文精选了15道iOS面试题,并提供了详细的解答思路。旨在帮助开发者更好地准备面试,避免因准备不足而导致的紧张和焦虑。 ... [详细]
  • FinOps 与 Serverless 的结合:破解云成本难题
    本文探讨了如何通过 FinOps 实践优化 Serverless 应用的成本管理,提出了首个 Serverless 函数总成本估计模型,并分享了多种有效的成本优化策略。 ... [详细]
  • 本文介绍如何使用 Android 的 Canvas 和 View 组件创建一个简单的绘图板应用程序,支持触摸绘画和保存图片功能。 ... [详细]
  • thereissomethingstrangeinmycode.Imsuretoforgetsomethingbutidontknowwhat.Itryto ... [详细]
  • 作为一名在大型手机游戏公司工作的程序员,尽管主要负责游戏逻辑和内容的开发,但对iOS底层开发接触较少。现在有了iPhone和可以虚拟MAC环境的电脑,希望能找到有效的iOS开发学习路径。 ... [详细]
  • 本文详细介绍了如何在iOS5中创建和理解简单的Hello World应用,包括Interface Builder的使用、Objective-C源代码文件的结构以及事件处理机制。 ... [详细]
  • Flutter 核心技术与混合开发模式深入解析
    本文深入探讨了 Flutter 的核心技术,特别是其混合开发模式,包括统一管理模式和三端分离模式,以及混合栈原理。通过对比不同模式的优缺点,帮助开发者选择最适合项目的混合开发策略。 ... [详细]
  • 在《Cocos2d-x学习笔记:基础概念解析与内存管理机制深入探讨》中,详细介绍了Cocos2d-x的基础概念,并深入分析了其内存管理机制。特别是针对Boost库引入的智能指针管理方法进行了详细的讲解,例如在处理鱼的运动过程中,可以通过编写自定义函数来动态计算角度变化,利用CallFunc回调机制实现高效的游戏逻辑控制。此外,文章还探讨了如何通过智能指针优化资源管理和避免内存泄漏,为开发者提供了实用的编程技巧和最佳实践。 ... [详细]
  • Kubernetes 持久化存储与数据卷详解
    本文深入探讨 Kubernetes 中持久化存储的使用场景、PV/PVC/StorageClass 的基本操作及其实现原理,旨在帮助读者理解如何高效管理容器化应用的数据持久化需求。 ... [详细]
  • 本文介绍了如何在iOS应用中自定义导航栏按钮,包括使用普通按钮和图片生成导航条专用按钮的方法。同时,探讨了在不同版本的iOS系统中实现多按钮布局的技术方案。 ... [详细]
  • 本文提供了手势解锁功能的详细实现方法和源码下载链接。通过分析手势解锁的界面和逻辑,详细介绍如何在iOS应用中实现这一功能。 ... [详细]
  • iOS绘制就是采集点,贝塞尔曲线得到形状,绘图上下文去渲染出来AsanaDrawsana图形库,设计的挺好他可以画多种图形, ... [详细]
  • 本文探讨了亚马逊Go如何通过技术创新推动零售业的发展,以及面临的市场和隐私挑战。同时,介绍了亚马逊最新的‘刷手支付’技术及其潜在影响。 ... [详细]
  • 在软件开发过程中,经常需要将多个项目或模块进行集成和调试,尤其是当项目依赖于第三方开源库(如Cordova、CocoaPods)时。本文介绍了如何在Xcode中高效地进行多项目联合调试,分享了一些实用的技巧和最佳实践,帮助开发者解决常见的调试难题,提高开发效率。 ... [详细]
author-avatar
乌龟北京飘
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有