Устранение неполадок утечки памяти/цикла сохранения в руководстве по приложению камеры AppleIOS

Программируем под IOS
Ответить
Anonymous
 Устранение неполадок утечки памяти/цикла сохранения в руководстве по приложению камеры Apple

Сообщение Anonymous »

Я следую этому руководству по камере от Apple: https://developer.apple.com/tutorials/s ... erapreview
У меня есть DataModel:

Код: Выделить всё

final class DataModel: ObservableObject {

let camera = Camera()

@Published var frame: Image?

var isPhotosLoaded = false

init() {
print("DataModel init")
Task {
await handleCameraPreviews()
}
}

deinit {
print("DataModel deinit")
}

func handleCameraPreviews() async {
let imageStream = camera.previewStream
.map { $0.image }

for await image in imageStream {
Task { @MainActor in
// CIFilters to come...
frame = image
}
}
}
}
И камера:

Код: Выделить всё

class Camera: NSObject {

...

deinit() {
print("Camera > deinit")
}

private var addToPreviewStream: ((CIImage) -> Void)?

lazy var previewStream: AsyncStream = {
AsyncStream { continuation in
addToPreviewStream = { ciImage in
if !self.isPreviewPaused {
continuation.yield(ciImage)
}
}
}
}()

...

}

extension Camera: AVCaptureVideoDataOutputSampleBufferDelegate {

func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
guard let pixelBuffer = sampleBuffer.imageBuffer else { return }

addToPreviewStream?(CIImage(cvPixelBuffer: pixelBuffer))
}
}
Это работало хорошо, пока я не заметил, что использование памяти увеличивается каждый раз, когда я переключаюсь на второй вид и снова возвращаюсь к камере.
Каждый раз, когда я перехожу ко второму виду, я никогда не вижу «deinit», напечатанного ни из DataModel(), ни из Camera(). И когда я возвращаюсь к представлению камеры, я вижу, что DataModel() и Camera() печатают «init».
Я признаю, что очень мало понимаю в управлении памятью, но подозреваю, что существует сильный цикл сохранения.
Когда я закомментирую функцию handleCameraPreviews(), проблема исчезает. Я подозреваю, что именно отсюда происходит цикл сохранения или какая-то другая утечка, потому что оба объекта инициализируют и деинитируют, как и ожидалось.
Я попробовал обновить handleCameraPreviews(), чтобы добавить [weak self]:

Код: Выделить всё

init() {
print("DataModel init")

cameraTask = Task {
await camera.start()
}

previewTask = Task { [weak self] in
await self?.handleCameraPreviews()
}
}

func handleCameraPreviews() async {
let stream = camera.previewStream

for await frame in stream {
try Task.checkCancellation()

await MainActor.run { [weak self] in
guard let self else { return }

self.frame = frame.image
}
}
Но это не помогло. К сожалению, здесь у меня нет идей из-за ограниченности моих знаний. Есть предложения?
Спасибо!

Подробнее здесь: https://stackoverflow.com/questions/798 ... p-tutorial
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»