单例或类方法[重复]

2023-11-26

阅读完对某个问题的回复后question关于 Objective C 中的单例,似乎每个解决方案都在实例访问器中的线程方面做出了一些权衡。 IE。

@synchronized(self)
{
    if (sharedInstance == nil)
            sharedInstance = [[MySingleton alloc] init];
}
return sharedInstance;

这本质上是单线程访问单例,如果它是在操作中频繁使用的东西,那么似乎可能会导致线程不必要的争用。

简单地使用类对象作为单例实例并通过类方法公开功能有什么缺点,即

@interface MySingleton : NSObject {
}

+ (void)doSomething;
@end

@implementation MySingleton    
+ (void)initialize {
   //do some setup if necessary
}

+ (void)doSomething {
    //do something
}
@end

通过这种方式,我们可以避免每次想要引用单例对象时都进行锁定+检查,并且还可以消除将其存储在本地或方法 ivar 中的必要。

这种方法还让运行时保证在任何给定时间系统中只存在一个实例(Class 对象)。

EDIT

这里不仅仅是线程,对于传统的单例,您通常编写如下代码:

MySingleton *instance = [MySingleton getSharedInstance];
NSObject *someResult = [instance getResult];
//or
if (instance.someProperty) {
  //do something
}

但是,如果您的单例是类实例,则基本上无需一直调用 getSharedInstance。考虑这段代码:

NSObject *someResult = [MySingleton getResult];
//or
if ([MySingleton someProperty]) {
  //do something
}

我听说你必须将数据存储在文件局部静态变量或全局变量中(恶心)。但它实际上与传统的单例并没有什么不同,只是您丢失了 Objective-C 2.0 属性(相反,您必须使用传统的访问器方法)。

对我来说,这是一个关键的权衡,这似乎是一场胜利。在传统的单例中,如果你真的想让事情变得正确,你最终会覆盖 -copyWithZone、+allocWithZone、-retain、-retainCount、-release 和 -autorelease。

每次你想要编写一个简单的 Singleton 对象时,这似乎需要做大量的工作(它们恰好非常有用)。那么为什么不简单地将其替换为:

@implementation MySingleton
+ (void)initialize {
    //do your setup
}

- (id)init {
    NSAssert(NO, @"You should read the documentation on singletons.");
}
@end

它在代码方面要轻得多,除非您的消费者真的很狡猾,否则他们永远不会创建两个实例。

已经进入正题了我的问题确实是这样的:

使用 Class 对象作为单例的实例有什么缺点吗?

似乎您可以在线程安全、内存效率等方面采取所有相同的步骤,而不必记住重写如此多的方法和访问器,或者用实例检查来乱扔代码。


对于 iOS 4.0 或更高版本,到目前为止最好的解决方案就是使用dispatch_once, as in

+ (id)sharedInstance {
    static dispatch_once_t predicate;
    dispatch_once(&predicate, ^{
        sharedInstance = [[MyClass alloc] init];
    });
    return sharedInstance;
}

您可能还需要考虑使用单个dispatch_queue来序列化对类内部的访问。如果您的所有公共方法只是在同一个dispatch_queue上运行一个块,那么您就不必担心并发问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

单例或类方法[重复] 的相关文章

  • 使用标识符启动 iPhone 应用程序

    我正在尝试在我的应用程序中启动应用程序 例如 如果我按下 testApp1 中的按钮 它应该打开 testApp2 有没有办法用应用程序标识符来做到这一点 我听说过一种名为的未记录方法launchApplicationWithIdentif
  • 如何将设备上未保存的图片上传到dropbox帐户?(IOS)

    Dropbox RestClient 仅保存文件 所以我想先将图像保存在本地文件夹中 然后上传它 结果它保存了文件 但它已损坏 NSString localPath NSBundle mainBundle pathForResource I
  • 如何随机化 NSArray? [复制]

    这个问题在这里已经有答案了 假设我有一个 NSArray 里面有 50 100 个对象 如何将数组按随机顺序排列 有很多方法可以做到这一点 但大多数只涉及生成随机数 也许您可以使用 NSMutableArray 使用此技术 生成 0 到 4
  • iOS通过AVAssetWriter反转音频

    我正在尝试使用 AVAsset 和 AVAssetWriter 在 iOS 中反转音频 以下代码可以正常工作 但输出文件比输入文件短 例如 输入文件的持续时间为 1 59 但输出文件的持续时间为 1 50 且音频内容相同 void reve
  • 有没有办法以编程方式选择 Segue 锚点?

    假设我有一个 Storyboard 其中包含一个包含按钮的视图 当用户按下此按钮时 会出现一个弹出窗口 因此 我需要使用 Xcode 将 Segue 拖动到按钮来设置锚点 然后执行使用标识符执行Segue 所以 我的问题是 有没有办法以编程
  • 将 NSDictionary 保存到文件有任何限制吗

    我想用下面的方法来保存NSDictionary void writeDicToFile NSDictionary dic fileName NSString fileName NSString filePath NSTemporaryDir
  • MIDI 文件解析

    我们如何使用 Objective C 进行 MIDI 文件解析 在Java中用于MIDI文件解析的包名为javax sound midi Objective c 有什么东西吗 如果你们中有人回复的话将会有很大的帮助 提前致谢 您可以使用 C
  • 以编程方式进行排序时检索 ViewController 堆栈

    static func showMenuView parentVC UIViewController let storyboard UIStoryboard name Main bundle nil let resultController
  • 播放声音无延迟 iOS

    我找不到如何以低延迟播放真实声音的方法 我尝试使用 AVFoundation 音频播放器 巨大的延迟大约 500 毫秒 所以我尝试创建系统声音 如果运气不好 延迟大约为 200 毫秒 虽然不多 但对我来说没有用 我最多需要 50 毫秒 确保
  • 如何执行 UIAlertAction 的处理程序?

    我正在尝试编写一个帮助程序类以允许我们的应用程序支持两者UIAlertAction and UIAlertView 然而 当写alertView clickedButtonAtIndex 方法为UIAlertViewDelegate 我遇到
  • 如何创建一个仅接收一次信号,然后自行取消订阅/释放的 ReactiveCocoa 订阅者?

    我目前正在注册一个属性信号的订阅者 如下所示 RACAble self test subscribeNext id x NSLog signal fired 默认功能是每次 self test 更改时都会触发 但我只想触发一次 然后取消订阅
  • iOS:保持应用程序在后台运行

    如何让我的应用程序在后台运行 我需要越狱我的 iPhone 才能执行此操作吗 我只需要这个应用程序每隔设定的时间间隔从互联网上检查一些内容 并在需要时发出通知 以供我自己使用 是的 不需要越狱 查看本文档的 实现长时间运行的后台任务 部分A
  • 替代已弃用的 NSNibLoading 方法(loadNibFile:、loadNibNamed: 等)?

    我发现 NSBundle 中的 NSNibLoading 方法 NSBundle loadNibFile externalNameTable withZone NSBundle loadNibNamed owner NSBundle loa
  • UITextField 字体大小在开始或停止输入字符时发生变化

    我见过很多线程 但没有找到解决这个问题的任何具体解决方案 我使用 XIB 创建了 UITextfield 尚未以编程方式对该字段执行任何操作 一旦我开始打字 文本字段的字体就会改变 一旦我将焦点移出文本字段 并且随着键盘消失 字体大小就会减
  • ios 8 核心数据崩溃

    保存时 CoreData 发生崩溃 2014 09 16 09 51 58 273 My app 2678 105246 Terminating app due to uncaught exception NSInvalidArgument
  • iPhone,使用 isKindOfClass 是否被认为是不好的做法?

    例如 如果有一个 处理所有 类型的方法 if obj isKindOfClass class1 else if obj isKindOfClass class2 etc 这是不好的做法吗 是否有更简洁的替代方案或更好的方法来构建代码 在运行
  • iOS:从非图像数据生成图像(Godus,如风景)

    所以看到图像后Godus http www kickstarter com projects 22cans project godus我想知道如何生成简单的 非交互式的 2D 图像 with 不同高度或层数的颜色不同就像下面的图片一样 我只
  • 使用反射的属性类型或类

    我想知道是否可以确定对象属性的类或原始类型 获取所有属性名称和值非常容易 所以答案 https stackoverflow com questions 2299841 objective c introspection reflection
  • iPhone SDK - 在后台线程中运行重复进程

    我有一个iPhone我想在其中每隔一段时间在后台执行一个方法的应用程序1第二 所以在我的主线程中 我有以下代码UIViewController viewDidLoad NSTimer timerWithTimeInterval 1 0 ta
  • 如何在内存中存储分子?

    我想将分子存储在内存中 这些可以是简单的分子 Methane CH4 C H bond length 108 7 pm H H angle 109 degrees But also more complex molecules like p

随机推荐

  • 如何限制 Neo4j 中两个节点之间只有一种关系?

    我有以下图表 目前我正在使用此查询来添加两个节点之间的关系 MATCH a Service b Service WHERE a service id cs2322 and b service id ab3232 CREATE a r DEP
  • 当 DataGrid 接收键盘焦点时,聚焦于 SelectedItem 的 DataGrid 单元格

    我有一个DataGrid哪里的SelectedItem绑定到 VM Selected 属性 我有一个搜索控件 可以进行查找 并且SelectedItem of the DataGrid更改 并滚动到视图中 WPF 4 0 和DataGrid
  • 如何避免在 Angular 2 中使用很长的相对路径进行导入?

    我怎样才能介绍类似的东西 my app name services 以避免像下面这样的导入行 import XyService from services validation xy service 打字稿 2 0 在 TypeScript
  • 由使用本地系统帐户的 Windows 服务启动的可执行文件无法访问网络共享

    我有一个由 Windows 服务启动的可执行文件 该程序将在客户计算机上运行 并且需要连接到远程共享才能执行特定任务 该共享由客户通过 UI 指定 因此我们事先不知道这一点 这意味着它不能 硬编码 也不能提前映射共享 以前我们要求客户登录到
  • 将 IPython 笔记本导出到 Reveal.js 时如何分隔幻灯片?

    当我使用 IPython 笔记本执行 Reveal js 演示文稿时 ipython nbconvert mynotebook ipynb to slides post serve 我将所有内容作为一张幻灯片来获取 如何将我的内容分成几张幻
  • 如何在 SQL Server 数据库中设计用户/角色架构?

    我想设计一个用户 角色系统 用户有一个名称和一个密码 然后用户可以有多个角色 例如Admin 为此 我创建了一个如下的架构 Users CREATE TABLE dbo Users id int NOT NULL name nvarchar
  • 如何easy_install Egg插件并在不重新启动应用程序的情况下加载它?

    我正在创建一个下载并安装自己的 Egg 插件的应用程序 但在 easy install 将 Egg 提取到位后加载 Egg 时遇到问题 现在是这样的 应用程序将egg下载到临时文件夹中 使用 setuptools command easy
  • EPERM,操作不允许错误,配置存储

    我知道这是一个常见错误node但我所有的故障排除技术似乎都失败了 Windows 7 32 位 电子邮件受保护 电子邮件受保护 当尝试运行诸如以下的包命令时会出现此问题bower and yo 自耕农 为了保持理智 在执行这些命令时 我处于
  • NumPy 或 Pandas:在具有 NaN 值的同时将数组类型保持为整数

    是否有一种首选方法来保留 a 的数据类型numpy数组固定为int or int64或其他 同时仍然有一个元素被列为numpy NaN 特别是 我正在将内部数据结构转换为 Pandas DataFrame 在我们的结构中 我们有仍然具有 N
  • 是否可以在 BigQuery 中使用 MD5 进行哈希处理?

    BigQuery 是否具有 MD5 功能 我知道它有 cityhash 但我特别需要 MD5 谢谢 例如 由于这会出现在 Google 搜索 BigQuery MD5 中 因此值得指出的是 BigQuery 本身支持以下哈希函数标准SQL
  • 相对较慢的python numpy 3D傅里叶变换

    对于我的工作 我需要对大图像执行离散傅立叶变换 DFT 在当前示例中 我需要 1921 x 512 x 512 图像的 3D FT 以及 512 x 512 图像的 2D FFT 现在 我正在使用 numpy 包和相关函数np fft ff
  • Java 中的按位与、按位或或问题

    我的项目中有几行代码 我看不到它们的价值 buffer i currentByte 0x7F currentByte 0x80 它从文件中读取文件缓冲区 存储为字节 然后传输到 buffer i 如图所示 但我无法理解总体目的是什么 有什么
  • 如何使用 CSS 设置警报框样式?

    更新 我读了很多关于这个主题的文章 尝试了一些脚本 需要帮助来找出你能做什么或不能做什么 社区回答了这一切 以下是一个很好的起点 这里的答案摘自下面的社区 谢谢 您无法覆盖默认的警报方式 它是由您的客户端生成的 edge chrome fi
  • 如何在 VB.NET 中获取 Caps Lock 的当前状态?

    如何使用 VB NET 查明 Caps Lock 是否已激活 这是我的后续先前的问题 Control IsKeyLocked Keys 方法 MSDN Imports System Imports System Windows Forms
  • XmlSerializer、“指定”后缀和 IReflect

    我发现如果一个可序列化的领域 财产有一个对应的类型字段Boolean名字为领域 财产带有 指定 后缀的名称 XmlSerializer 有条件地排除该名称领域 财产从序列化过程来看 好的 所以 我想避免这些字段的定义 并在运行时动态添加它们
  • curl 响应显示“不支持 HTTP 版本”,错误 505

    我使用curl发出请求 响应说不支持HTTP版本 错误505 使HTTP版本受支持的步骤是什么 谷歌搜索后 我应该使用curl http2 0 来使其工作 但我的curl 版本不支持该选项 因为它是在curl 7 33 中添加的 而我使用的
  • 我可以从脚本或命令行将文件复制到网上邻居吗? [关闭]

    Closed 这个问题是无关 目前不接受答案 在 Windows XP 中 是否可以通过命令行 批处理文件或者更好的 PowerShell 脚本将文件复制到网上邻居 让我走上这条研究道路的是尝试将文件从用户的计算机发布到 WSS 3 0 文
  • Notepad++ 正则表达式 -> newLine

    我使用 Notepad 我需要删除以 abc 开头的所有行 注意 我不需要将以 abc 开头的行替换为空行 但我需要完全删除这些行 我该如何继续 我想使用正则表达式 尝试更换 abc r n with nothing The 表示一行的开始
  • jQuery 动画回到原始位置

    我正在开发一个网站 其中有一些绝对定位的 div 我需要在单击时调整其大小 然后这些将填充 div 所在的容器 问题是如何让它们切换到去返回到原始位置 顶部 左侧 每个位置都不同 work item toggle toggle functi
  • 单例或类方法[重复]

    这个问题在这里已经有答案了 阅读完对某个问题的回复后question关于 Objective C 中的单例 似乎每个解决方案都在实例访问器中的线程方面做出了一些权衡 IE synchronized self if sharedInstanc