修复自定义数组的同时内存访问错误 class iOS
Fixing simultaneous memory access error for array of custom class iOS
在我的应用程序中,我有一个 viewcontroller 和 table 视图,当它加载时,它给我大约 12 个同步内存错误,所有错误都在我尝试从我的自定义中删除元素的同一个地方大批。下面是相关代码
在我的 viewcontroller 中 table 加载我访问了如下方法
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell{
//Some Code
arrangeTableObject.arrangetableSectionsInOrderForNoteType(withFrameId:tableDataSection.frameId.uintValue)
//Some code
return cell
}
在我的另一个 swift class arrangeTableObject.swift 这就是我使用这些方法的方式
//My custom array is defined as
var tableSections : [TableSection]?
func arrangetableSectionsInOrderForNoteType(type: NoteType){
var tableIndex = 0
if tableSectionForItemType(itemType: .tableItemNoteItems) != nil {
let noteItemSection = tableSectionForItemType(itemType: .tableItemNoteItems)
removetableSectionWithFrameId(itemType: . tableItemNoteItems)
tableSections?.insert(noteItemSection!, at: tableIndex)
tableIndex += 1
}
if let commentSection = tableSectionForItemType(itemType: .tableItemComment) {
removetableSectionWithFrameId(itemType: .tableItemComment)
tableSections?.insert(commentSection, at: tableIndex)
tableIndex+=1
}
if tableSectionForItemType(itemType: .tableItemAtAGlance) != nil {
let otherSection = tableSectionForItemType(itemType: .tableItemOtherItems)
removetableSectionWithFrameId(itemType: . tableItemOtherItems)
tableSections?.insert(otherSection!, at: tableIndex)
tableIndex += 1
}
}
//这是显示错误的方法
func removetableSectionWithFrameId(itemType : tableItemType){
if tableSections?.count != 0 {
for section in tableSections! {
if section.itemType == itemType {
//Error points to this line below
self.tableSections?.remove(at: self.tableSections!.index(of: section)!)
}
}
}
}
为了修复,我尝试使用以下方法添加同步锁
func sync(lock: NSObject, closure: () -> Void) {
objc_sync_enter(lock)
closure()
objc_sync_exit(lock)
}
我尝试修改错误发生的部分如下,但它仍然抛出同样的错误
if section.itemType == itemType {
sync(lock: tableSections! as NSObject){
self.tableSections?.remove(at: self.tableSections!.index(of: section)!)
}
}
如有任何建议或指导,我们将不胜感激。
可能的原因是您在迭代数组时删除了数组中的元素。
尝试以下操作,看看是否有任何问题
tableSections = tableSections.filter { [=10=].itemType != itemType }
在我的应用程序中,我有一个 viewcontroller 和 table 视图,当它加载时,它给我大约 12 个同步内存错误,所有错误都在我尝试从我的自定义中删除元素的同一个地方大批。下面是相关代码
在我的 viewcontroller 中 table 加载我访问了如下方法
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell{
//Some Code
arrangeTableObject.arrangetableSectionsInOrderForNoteType(withFrameId:tableDataSection.frameId.uintValue)
//Some code
return cell
}
在我的另一个 swift class arrangeTableObject.swift 这就是我使用这些方法的方式
//My custom array is defined as
var tableSections : [TableSection]?
func arrangetableSectionsInOrderForNoteType(type: NoteType){
var tableIndex = 0
if tableSectionForItemType(itemType: .tableItemNoteItems) != nil {
let noteItemSection = tableSectionForItemType(itemType: .tableItemNoteItems)
removetableSectionWithFrameId(itemType: . tableItemNoteItems)
tableSections?.insert(noteItemSection!, at: tableIndex)
tableIndex += 1
}
if let commentSection = tableSectionForItemType(itemType: .tableItemComment) {
removetableSectionWithFrameId(itemType: .tableItemComment)
tableSections?.insert(commentSection, at: tableIndex)
tableIndex+=1
}
if tableSectionForItemType(itemType: .tableItemAtAGlance) != nil {
let otherSection = tableSectionForItemType(itemType: .tableItemOtherItems)
removetableSectionWithFrameId(itemType: . tableItemOtherItems)
tableSections?.insert(otherSection!, at: tableIndex)
tableIndex += 1
}
}
//这是显示错误的方法
func removetableSectionWithFrameId(itemType : tableItemType){
if tableSections?.count != 0 {
for section in tableSections! {
if section.itemType == itemType {
//Error points to this line below
self.tableSections?.remove(at: self.tableSections!.index(of: section)!)
}
}
}
}
为了修复,我尝试使用以下方法添加同步锁
func sync(lock: NSObject, closure: () -> Void) {
objc_sync_enter(lock)
closure()
objc_sync_exit(lock)
}
我尝试修改错误发生的部分如下,但它仍然抛出同样的错误
if section.itemType == itemType {
sync(lock: tableSections! as NSObject){
self.tableSections?.remove(at: self.tableSections!.index(of: section)!)
}
}
如有任何建议或指导,我们将不胜感激。
可能的原因是您在迭代数组时删除了数组中的元素。
尝试以下操作,看看是否有任何问题
tableSections = tableSections.filter { [=10=].itemType != itemType }