Swift UI — поток 1: EXC_BAD_ACCESS (код = 2

#swift #list #image #exc-bad-access

#swift #Список #изображение #исключение-плохой доступ

Вопрос:

Я добавил значки системных дисков (NSImage) в свой список дисков

Теперь приложение выходит из строя в AppDelegate.swift в строке 13 class AppDelegate: NSObject, NSApplicationDelegate { с Thread 1: EXC_BAD_ACCESS (code=2, address=0x7ffeef3fff48)

Я знаю, что я добавляю изображения, потому что, когда я заменяю их текстом, все в порядке

Вот класс, в который я добавляю изображения.

 import SwiftUI

let workspace = NSWorkspace.init()

struct DriveList: View {
   let drives = SDCardTools.getDrives()!
   var body: some View {
       return List(drives) { drive in
           DriveRow(drive : drive)
       }
   }
}

struct DriveRow: View {
   var drive : Drive
   
   var body: some View {
       HStack {
           DriveIcon(path : drive.path)
               padding(10)
           Text(drive.name)
       }
   }
}

struct DriveIcon : View {
   
   var path: String
   var body: some View {
       Image(nsImage: workspace.icon(forFile: path ))
           .resizable()
           .frame(width: 50, height: 50)
   }
}

struct DriveList_Previews: PreviewProvider {
   static var previews: some View {
       DriveList()
   }
}
  

Очередь потока 1: com.apple.main-поток (последовательный)
#0 0x00007fff44382883 в специализированной статической среде Readingview._makeView(просмотр:входные данные:) ()
#1 0x00007fff44384668 в свидетеле протокола для статического просмотра._makeView(просмотр: входные данные:) в изображении соответствия ()
#2 0x00007fff44384610 в свидетеле протокола для статического просмотра._makeView(просмотр: входные данные:) в изображении соответствия ()
#3 0x00007fff441c20e9 в TypedUnaryViewGenerator.makeView(в:входные данные: идентификатор: Косвенная карта:) ()
#4 0x00007fff441c21f9 в свидетеле протокола для UnaryViewGenerator.makeView(в: входы: идентификатор: Косвенная карта:) в соответствии с типом unaryviewgenerator ()
#5 0x00007fff441bc9b0 в закрытии #1 в UnaryElements.makeElements(из: в: входы: Косвенная карта:тело:) ()
#6 0x00007fff441c4801 в частичной заявке на закрытие #1 в UnaryElements.makeElements(из: в: входы: Косвенная карта:тело:) ()
#7 0x00007fff441bf61b в закрытии #1 в закрытии #1 в закрытии #1 в закрытии # 1 в закрытии #1 в ModifiedElements.makeElements(из:in:inputs:indirectMap:body:) ()
#8 0x00007fff441ce4c5 в частичной подаче заявки на закрытие # 1 в закрытии #1 в закрытии # 1 в закрытии # 1 в ModifiedElements.makeElements(из:in:inputs:indirectMap:body:) ()
#9 0x00007fff445adb15 в специализированном статическом UnaryLayout<>.makeViewImpl(модификатор:входные данные: тело:) ()
#10 0x00007fff4430e339 в специализированном статическом UnaryLayout._makeView(модификатор: входные данные: тело:) ()
#11 0x00007fff4430f101 в свидетеле протокола для статического ViewModifier._makeView(модификатор: входные данные: тело:) в соответствии с _AspectRatioLayout ()
#12 0x00007fff4430eec8 в свидетеле протокола для статического ViewModifier._makeView(модификатор: входные данные: тело:) в соответствии с _FrameLayout ()
#13 0x00007fff441bf2a5 в закрытии #1 в закрытии #1 в закрытии #1 в ModifiedElements.makeElements(из:в: входы: Косвенная карта:тело:) ()
#14 0x00007fff441ce43d в частичной подаче заявки на закрытие # 1 в закрытии #1 в закрытии # 1 в ModifiedElements.makeElements(из:in:inputs:indirectMap:body:) ()
#15 0x00007fff441813ef в закрытии #2 в статическом _Layout<>.makeStaticView(root:входные данные:список:) ()

Любая помощь, которую вы можете предоставить, будет с благодарностью оценена 🙂

Комментарии:

1. Обычно это очень полезно, когда вы также предоставляете некоторую информацию с консоли 😉

2. (lldb) — это все, что есть в консоли, но я добавил сведения о потоке в сообщение

3. Не могли бы вы сделать это в качестве воспроизводимого примера, чтобы любой мог протестировать локально? Кроме того, где расположены эти значки?

4. Это системные значки для дисков. Я могу загрузить его в bit bucket, чтобы вы могли взглянуть

5. Спасибо @Asperi, вы можете клонировать его из кода , чтобы вы могли взглянуть

Ответ №1:

Ошибка очень запутанная, она связана с неотчуждаемой природой padding модификатора… и компилятор передает его без использования в качестве фактического модификатора, что приводит к сбою.

Вот исправление

 struct DriveRow: View {
    var drive : Drive
    
    var body: some View {
        HStack {
            DriveIcon(path : drive.path)
                .padding(10)            // << in this line you missed '.' dot
            Text(drive.name)
        }
    }
}
  

Комментарии:

1. Спасибо, но я только что попробовал, но все та же проблема. Но все равно очень полезно знать 🙂

2. Спасибо, Аспери, я посмотрю сегодня вечером. Очень признателен 🙂

3. Это сработало. Спасибо Asperi. Думаю, я ожидал, что Xcode подберет что-то подобное! В следующий раз я буду следить за ошибками такого рода!

4. Работает для меня. У меня не было точки для onTapGesture, и это привело к сбою во время выполнения, а не к ошибке компиляции. Невероятно

5. Я потратил некоторое время на аналогичную проблему, а затем обнаружил это. Спасибо. ТОЧКА? Я думаю, что Xcode должен кричать на меня в первую очередь.