You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

向NSMutableArray添加对象时崩溃,SwiftDeferredNSArray问题求助

解决NSMutableArray调用addObject崩溃的问题

这个问题我之前也碰到过,本质是Swift和Objective-C集合桥接时的隐式转换坑!你声明的List虽然是NSMutableArray类型,但实际上它被替换成了Swift._SwiftDeferredNSArray——这是Swift用来桥接不可变数组的内部类,本身不支持addObject:这类可变操作,所以调用时就会触发“unrecognized selector”崩溃。

为什么会出现这种情况?

大概率是你在某个地方把Swift原生不可变Array或者Objective-C的NSArray直接赋值给了List变量,Swift的桥接机制会偷偷把它转换成SwiftDeferredNSArray,而不是真正的NSMutableArray。比如类似这样的错误操作:

// 错误示例:把Swift Array直接赋值给NSMutableArray变量
let swiftArray = ["a", "b"]
List = swiftArray as NSMutableArray // 这里实际得到的是SwiftDeferredNSArray

解决办法

给你几个靠谱的方案,按优先级推荐:

  • 优先改用Swift原生Array:既然是Swift代码,尽量用Swift的集合类型,安全又省心。把代码改成:

    var list: [Any] = [] // 用var声明可变数组
    list.append(obj) // 用append添加元素,完全不会有桥接问题
    
  • 确保始终持有真正的NSMutableArray:如果必须用NSMutableArray,任何时候赋值都要显式创建可变实例,比如:

    // 从Swift Array转换时
    let swiftArray = ["a", "b"]
    List = NSMutableArray(array: swiftArray) // 显式初始化可变数组
    
    // 从NSArray转换时
    let nsArray = someMethodReturningNSArray()
    List = NSMutableArray(array: nsArray)
    
  • 检查赋值逻辑:排查代码中所有给List赋值的地方,确保没有直接把不可变数组(不管是Swift还是OC的)赋值给它,必须通过NSMutableArray(array:)来转换。

内容的提问来源于stack exchange,提问作者Abhishek Master

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:34:05