NSMutableArray 线程安全

2023-12-22

在我的应用程序中,我正在从多个线程访问和更改可变数组。一开始,当我尝试使用以下命令访问对象时,它崩溃了objectAtIndex,因为索引超出范围(该索引处的对象已从另一个线程的数组中删除)。我在网上搜索了如何解决这个问题,我决定尝试这个solution https://stackoverflow.com/a/3521873/2298998.我上了一堂课NSMutableArray属性,见如下代码:

@interface SynchronizedArray()
@property (retain, atomic) NSMutableArray *array;
@end

@implementation SynchronizedArray

- (id)init
{
    self = [super init];
    if (self)
    {
        _array = [[NSMutableArray alloc] init];
    }
    return self;
}

-(id)objectAtIndex:(NSUInteger)index
{
    @synchronized(_array)
    {
        return [_array objectAtIndex:index];
    }
}

-(void)removeObject:(id)object
{
    @synchronized(_array)
    {
        [_array removeObject:object];
    }
}

-(void)removeObjectAtIndex:(NSUInteger)index
{
    @synchronized(_array)
    {
        [_array removeObjectAtIndex:index];
    }
}

-(void)addObject:(id)object
{
    @synchronized(_array)
    {
        [_array addObject:object];
    }
}

- (NSUInteger)count
{
    @synchronized(_array)
    {
        return [_array count];
    }
}

-(void)removeAllObjects
{
    @synchronized(_array)
    {
        [_array removeAllObjects];
    }
}

-(id)copy
{
    @synchronized(_array)
    {
        return [_array copy];
    }
}

我使用此类而不是旧的可变数组,但应用程序仍然在这一行崩溃:return [_array objectAtIndex:index];我也尝试过这种方法NSLock,但没有运气。我做错了什么以及如何解决这个问题?


我认为这个解决方案很差。考虑一下:

  1. 线程 #1 调用count并被告知数组中有 4 个对象。
  2. 数组不同步。
  3. 线程 #2 调用removeObjectAtIndex:2在阵列上。
  4. 数组不同步。
  5. 线程 #1 调用objectAtIndex:3并发生错误。

相反,您需要一个更高级别的锁定机制,其中锁位于步骤 1 和 5 中的数组周围,并且线程 #2 无法删除这些步骤之间的对象。

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

NSMutableArray 线程安全 的相关文章

  • 为什么performSegueWithIdentifier在viewDidLoad中不起作用?

    我试图在视图控制器上调用 viewDidLoad 后立即触发故事板转场 Segue 附加了一个标识符 当从链接到按钮或其他控件的方法内部调用时 它可以正常工作 但它在 viewDidLoad 内部不起作用 它只是默默地失败了 viewDid
  • 如何从 ContentView 外部显示 SwiftUI 警报?

    我正在构建 Swift 应用程序 并试图找出如何显示警报 我有一个单独的 swift 文件正在执行一些计算 并且在某些条件下我希望它向用户显示警报 基本上告诉他们出了问题 然而 我见过的大多数例子都要求警报在ContentView或以其他方
  • iOS、通用链接、Swift。 continueUserActivity 未调用

    我正在为我们的 iOS 应用程序实现通用链接 这是我的一小部分 AppDelegate private func application application UIApplication openURL url URL sourceApp
  • 如何制作带有 SWIFT 图像的弹出窗口

    我想知道如何制作类似于此示例的弹出窗口 原始窗口充满了按钮 选择这些按钮后将拉出我想要使用的图像 我会简单地创建一个可重用的UIView组件以及作为子视图所需的一切 例如UIImageView为了你的形象 UILabel or a UIBu
  • 从一个模态视图无缝翻转到另一个模态视图,而不显示纯色背景

    我的 iPad 应用程序的 UI 如下 当我点击Settings按钮 我希望对话框水平翻转以显示设置对话框 我这个工作正常 但是 当对话翻转时会显示背景颜色 如你看到的 有什么办法可以让对话框翻转时不显示该颜色块吗 我希望它看起来更加无缝
  • 每 24 小时触发一次方法

    我正在尝试每天在给定时间触发一个方法 我尝试了一些方法 但我无法真正使其发挥作用 任何意见 将不胜感激 此外 如果无论应用程序是否打开它都会触发 那就更理想了 这可能吗 UI本地通知 http developer apple com lib
  • 生成具有固定数字长度的随机数?

    我正在生成随机数 int randomID arc4random 3000 但我想生成至少 4 位数字的随机数 如 1000 2400 1122 我想知道 Objective C 的代码 请尝试 生成数字 1000 9999 int ran
  • iOS 中 NSDecimalNumber 的小数分隔符错误

    我尝试通过以下方式输出具有正确的小数分隔符的十进制数的描述 NSString strValue 9 94300 NSDecimalNumber decimalNumber NSDecimalNumber decimalNumberWithS
  • (Kiss)XML xpath 和默认命名空间

    我正在开发一个 iPhone 项目 需要解析一些 xml xml 可能包含也可能不包含默认名称空间 我需要知道如何解析 xml 以防它使用默认命名空间 由于我需要读取和写入 xml 因此我倾向于使用 KissXML 但我愿意接受建议 这是我
  • 使用未解析的标识符“FlurryAdInterstitial”

    我正在尝试整合Flurry Interstitial Ads使用cocoapods in Swift and Xcode 7 1 1 我正在关注开发人员雅虎网站上的此文档 https developer yahoo com flurry d
  • 在 iPhone 3GS 与 iPhone 4 上为 Mobile Safari 嵌入 HTML5 视频

    我在服务器上的 mp4 文件中有 H 264 AAC 编码的视频 mime 类型的视频 mp4 添加到 Web 服务器 IIS 7 并且我有一个带有视频标签的页面
  • Cocoa 应用程序菜单栏不可点击

    我正在我的可可应用程序中构建一个菜单栏 其中包含以下代码 implementation我的自定义应用程序CustomApplication void setUpMenuBar CustomApplication sharedApplicat
  • 如何在没有 SDK 的情况下在 Objective C 中为 S3 创建预签名 URL?

    我正在构建一个 mac 应用程序not使用 AWS iOS 开发工具包 我尝试构建的 GET 请求应遵循以下通用格式 Authorization AWS AWSAccessKeyId base64 hmac sha1 VERB n CONT
  • 如何向标准 UIButton 添加徽章? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 是否可以在标准中添加看起来标准的徽章UIButton 如果不支持半原生 那么实现此目的最简单的方法是什么 示例图片 这是 Sascha
  • 访问目标 c 中的类方法。使用 self 还是类名?

    我正在学习 iOS 编程 并且对以下有关关键字 self 的使用的代码感到困惑 据我了解 self就像Java的this 它指的是当前实例 当我想调用类方法时 通常的方式应该是这样 PlayingCard validSuits 但是侵入实例
  • 如何在代码中编辑约束

    我有一个以 100 开始宽度限制的网页 当用户单击按钮时 我想将约束更改为 200 我试过这个 NSLayoutConstraint constrain NSLayoutConstraint constraintWithItem self
  • 在 UIWebView 中播放 Facebook 视频

    有谁知道如何在 Facebook 上播放视频UIWebView 我的应用程序将视频上 传到 Facebook 并检索视频的网址 我想将此网址嵌入到UIWebView播放 我已经为 youtube 解决了这个问题 但没有为 Facebook
  • 如何解决 Xcode 5 中的红色(已移动)文件?

    在 Xcode 4 中 当您要移动文件时 可以通过单击右侧菜单中的按钮并通过 Finder 选择新位置来解析文件的新位置 在 Xcode 5 中 右侧菜单中没有按钮 我还没有找到任何方法通过右键单击文件或顶部菜单栏选项来指定文件的新位置 在
  • 是否可以跨 2 个不同的 iOS 应用程序访问数据?

    假设我在 App1 中存储了一些 ID 数据 并希望在同一设备上的 App2 中访问它 平台上可以这样吗 如果没有的话有什么解决方法吗 您可以使用iOS 钥匙扣 http developer apple com library ios do
  • 像 TraceGL 一样分析 Objective C 中的代码路径?

    TraceGL 是一个非常简洁的项目 它允许 JS 程序员跟踪 Javascript 中的代码路径 它看起来像这样 我想为 Objective C 构建类似的东西 我知道运行时使跟踪方法调用变得相当容易 但是我如何跟踪控制流 例如 在上面的

随机推荐

  • 在球衣请求中获取客户端区域设置

    获得的最佳且更便携的方式是什么客户端区域设置在 Jersey JAX RS 请求的上下文中 我有以下代码 GET Produces text html Path myrequest public Response myRequest Con
  • 从终端删除 Safari cookie

    我正在制作一个涉及从 Applescript 控制 Safari 的应用程序 有没有办法在终端 首选 或Applescript 中删除Safari 的cookie 基本上我想使用终端从菜单中选择 重置 Safari 项目 有没有一种方法可以
  • 两个 无间距

  • 在 mac osx 11.6 上安装 ruby​​ 2.6.x 和 3.0.x 时 ruby​​-install 失败

    运行 ruby install 时 构建失败 rbenv 问题中也报告了这一点 https github com rbenv ruby build issues 1725 https github com rbenv ruby build
  • 使用 AJAX 在 Rails 中自动保存表单

    我正在尝试为 Post new 操作自动保存表单 每隔一分钟左右 我想 POST 到 Post autosave 然后检查first or create 并保存 更新 Posts 表中的记录 但我的问题是 我无法再从表单访问 POST 参数
  • 在视频视图中播放 YouTube 视频

    在我的应用程序中 我有一个视频视图 我想在其中播放 YouTube 视频 为此 我尝试了很多方法 例如 VideoView mVideoView new VideoView this setContentView mVideoView mV
  • C++中的“new”运算符,指针问题

    愚蠢的问题 但是每当你调用 new 时 你总是有一个指针吗 SomeClass person new SomeClass 这是因为您需要一个指针来指向为 SomeClass 变量 person 分配的新内存空间吗 谢谢 If new成功完成
  • kml 谷歌扩展不在模式中

    我居住的司法管辖区使用谷歌地球发布了数据 他们指向的kml文件包含
  • 张量流图构造中没有形状错误,但在图计算过程中出现形状不匹配错误

    张量流图构造没有出现错误 但在图计算过程中出现形状不匹配错误tf gradients 我猜错误是在反向传播中 这是我得到的错误 InvalidArgumentError 请参阅上面的回溯 reshape 的输入是一个具有 16777216
  • Anaconda Prompt 不会启动 _NamespacePath

    我有一个奇怪的错误 我找不到解决方案 每次启动 Anaconda Prompt 运行 Windows 10 时 我都会在底部收到以下错误 即使我尝试使用 conda 我也会收到相同的错误 在安装信息之后 我尝试卸载并重新安装 Anacond
  • CSharpCodeProvider 似乎停留在 .NET 2.0,如何获得新功能?

    我有以下相当标准的代码作为包装器CSharpCodeProvider 这个类工作得很好 并且执行得很好等等 但是 尽管我的应用程序是针对 NET 3 5 构建的 并且在进行此编译时引用了 v3 5 程序集 但我仍然无法访问任何额外好的 C
  • 使用 rustc 和 clang 运行 LLVM 文件

    我正在尝试运行 ll文件带有 clang 并出现链接器错误 我有一个文件test rs它只包含一个 main 函数println 陈述 我使用以下命令生成 LLVM IRrustc emit llvm ir crate type bin t
  • 用于字符串插值的 Swift 协议

    我必须实现什么协议来控制 Swift 中字符串插值中对象的表示方式 我不想指定打印的内容 如下所示 struct A var a A println a 您需要实施Printable协议 该协议应该被那些希望定制自己的类型的类型所采用 文本
  • 为什么 VStack 不能在带有滚动视图的 GeometryReader 中工作?

    我的 vStack 滚动视图在没有 GeometryReader 的情况下也能工作 在 AppleTV 中 我没有在 iOS 中进行测试 然后我添加了几何读取器 VStack 像 ZStack 一样 折叠 我能做什么来解决这个问题 是的 我
  • ASP.NET MVC 站点地图和/或安全调整

    ASP NET MVC 中是否有与 Web 表单中的 SiteMap 和安全调整功能等效的功能 我刚刚开始学习 MVC 一直在寻找解决方案 以防止在学习时走上错误的道路 Check ASP NET MVC 站点地图提供程序 https gi
  • 将 Param 与参数数组绑定

    我有一个函数可以执行此操作 function registerUser firstName lastName address postcode email password params array firstName lastName a
  • Oracle 中触发器无效

    在对表进行某些更改后 我的数据库中的某些触发器变得无效 但他们似乎仍在工作 我遇到的唯一问题是 如果我使用 SQL Developer 触发器的左侧会出现红叉 表明它们无效 这是一个大问题吗 我知道我可以重新编译触发器来解决这个问题 但我不
  • 为什么我的许可证没有显示?

    In my
  • Asp.Net MVC 验证 - 依赖字段

    我目前正在尝试进行 MVC 验证 并且遇到了一些问题 其中需要一个字段 具体取决于另一个字段的值 下面是一个例子 我还没弄清楚 如果 PaymentMethod Cheque 那么 ChequeName 应该是必需的 否则可以通过 Requ
  • NSMutableArray 线程安全

    在我的应用程序中 我正在从多个线程访问和更改可变数组 一开始 当我尝试使用以下命令访问对象时 它崩溃了objectAtIndex 因为索引超出范围 该索引处的对象已从另一个线程的数组中删除 我在网上搜索了如何解决这个问题 我决定尝试这个so