首页 > 其他分享 >【iOS开发】for in 可变数组 崩溃

【iOS开发】for in 可变数组 崩溃

时间:2023-05-22 12:02:38浏览次数:35  
标签:string iOS 122 444 枚举 数组 可变 array NSMutableArray


该问题来自一道笔试题:

一、执行下面代码会发生什么?什么解决?

NSMutableArray *array = [NSMutableArray arrayWithObjects: @"122", @"333", @"444", nil];
    
    for (NSString *string in array) {
        [array removeObject: string];
    }

答:会崩溃,提示 NSGenericException 异常。出现下面的报错信息

*** Terminating app due to uncaught exception ‘NSGenericException’, reason: ‘*** Collection <__NSArrayM: 0x600002848ab0> was mutated while being enumerated.’

意思是在枚举时,集合数据被修改了。

原因:

因为for…in…利用了快速枚举 NSFastEnumerate ,其在内部是用 Iterator(迭代器) 实现遍历的,一旦元素变动,之前的元素 全部被失效 ,所以在for each的循环当中,最好不要去进行元素的修改动作,若需要修改,循环改为for遍历,由于内部机制不同,不会产生修改后结果失效的问题。

二、解决办法三种

1、使用普通for循环

NSMutableArray *array = [NSMutableArray arrayWithObjects: @"122", @"333", @"444", nil];

    for (int i = 0; i < array.count; i++) {
        [array removeObject: array[i]];
    }

2、使用copy一个不可变数组进行删除

NSMutableArray *array = [NSMutableArray arrayWithObjects: @"122", @"333", @"444", nil];
	
    NSArray *copyArray = [array copy];
    for (NSString *string in copyArray) {
        [array removeObject: string];
    }

3、使用enumerateObjectsUsingBlock(枚举器)来遍历

NSMutableArray *array = [NSMutableArray arrayWithObjects: @"122", @"333", @"444", nil];

    [array enumerateObjectsUsingBlock:^(id  obj, NSUInteger idx, BOOL * stop) {
        [array removeObject: obj];
    }];

三、关于NSFastEnumerate迭代器和NSEnumerator枚举器的相关底层文章:

NSFastEnumeration (快速枚举)

Objective-C Fast Enumeration 实现原理

NSEnumerator && NSFastEnumerate


标签:string,iOS,122,444,枚举,数组,可变,array,NSMutableArray
From: https://blog.51cto.com/u_13481937/6322881

相关文章

  • 【iOS开发】APP增量更新和热修复
    一、业务环境公司提出我们的app每次更新不要全部下载,只需要下载修改的部分。二、实现方式通过使用第三方平台,不用下载AppStore上的app,进而进行代码bug的修复。JSPatchPlatform:iOSApp热修复服务平台......
  • 【iOS开发】一些常见的警告解决方案(更新中。。。)
    UnknownpatterncolorfortheBackgroundColorattribute1.背景色属性为未知模式的颜色解决:默认xib里面控件的背景色为Default。如果出现警告,可能是你定义的颜色Xcode启动时识别不了,请重新检查每个控件的背景色,在设置一下颜色就可以了。Unusedvariable‘temString’2.变量没有......
  • 【iOS开发】使用Xcode8 添加Launch Image(启动图片)之001
    一、Assets.xcassets->+->Appicons&LaunchImages->NewiOSLaunchImage二、设置为LaunchImage的图片,最好为.png格式三、单击工程名称->General->LaunchImagesSource改为LaunchImage->LaunchSourceFile的内容置为空四、将LaunchScreen.storyboard的设置中的Us......
  • 【React工作记录五十九】根据key值过滤形成新得数组
     目录前言导语 核心实现代码运行结果前言我是歌谣我有个兄弟巅峰的时候排名c站总榜19叫前端小歌谣曾经我花了三年的时间创作了他现在我要用五年的时间超越他今天又是接近兄弟的一天人生难免坎坷大不了从头再来歌谣的意志是永恒的放弃很容易但是坚持一定很酷导语根据key......
  • Python 什么是数组?
    在Python中,数组通常是指用于表示具有相同数据类型的多个元素的数据结构。在Python中,数组可以表示为列表或NumPy数组。列表:Python中最常用的数组表示法是“列表”。一个列表是由一系列有序元素的集合组成,每个元素可以是字符串、数字、布尔值和其他任何类型的对象。例如: ......
  • iOS的JS和OC代码互相调用
    1.JS调用OC代码步骤1:以下是html页面,test1函数,并没有在页面中声明,而是在OC的UIWebView中绑定的<html><head><script>//test2(p)函数是准备OC调用JS函数用的functiontest2(p){alert(p);}</script></head><body><......
  • Reflection反射在iOS下使用Objective-C 具体如何使用
       反射,一种计算机处理方式。是程序可以访问、检测和修改它本身状态或行为的一种能力。程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调......
  • iOS的KeyChain(钥匙串)的使用
    iOS的KeyChain(钥匙串)的使用Keychain钥匙串存储账号和密码,还可以多个应用之间分享此账号和密码,只需要配置一项,如下一张图片-1.iOS的keychain提供一种安全保存信息的方式,-2.可以保存密码等数据,而且keychain中的数据不会因为你删除app而丢失,-3.你可以在重新......
  • iOS应用程序之间数据共享
    iOS应用程序间共享数据我们知道由于iOS有安全沙盒机制,应用之间是不能直接访问,但是Apple友好的提供了四种访问机制它们分别是:1.粘贴板      UIPasteboard2.自定义URLScheme   3.AppGroups4.钥匙串以下,就详细的说说它们的原理和具体怎么使用。......
  • iOS上的Popover
    ZRPopoverViewZRPopoverViewisapopoverviewthatpopUIViewwithalistofbuttonbycustomisingeventsandcontents.#1.IfyoulikeinvokethiseventsbyblocksothatChooseNo.1.#2.IfyoulikeinvokethiseventsbydelegatesothatChooseNo.2.Effect......