向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
相关产品推荐
相关产品推荐

