小编fla*_*nez的帖子

如何模拟iOS设备上的磁盘空间不足情况?

我想测试一些代码,以管理没有足够的可用磁盘空间来完成操作的条件.

但是,我无法实现这种情况.我试图从iTunes同步填充设备,但要么我没有太多磁盘空间,要么内容将超过设备容量,iTunes将不允许同步.

我确信必须有一个更容易和更好的策略来测试设备上的这种情况,但我无法弄明白.我将不胜感激以及您可以分享的关于此的提示或经验.

iphone xcode objective-c ipad ios

10
推荐指数
1
解决办法
3352
查看次数

为什么CIContext.createCGImage导致内存泄漏?

我只在iOS 9上观察到这种行为; iOS 8正常工作.

我怀疑这可能是SDK上的一个错误,我已经向Apple(22644754)开了一个雷达,但我发现它很奇怪,我觉得我可能会错过一个电话或一个避免泄漏的步骤.

我观察到的是,每次调用CIContext.createCGImage时,都会增加内存使用量.棘手的部分是内存增加发生在应用程序之外.

如果从Xcode查看"内存报告",可以在"其他进程"部分看到内存增加.

基本上,我所做的导致问题的是以下(我已经将代码简化为严格重现泄漏所需的部分):

首先,我创建一个由EAGLContext支持的CIContext:

let glContext = EAGLContext(API: .OpenGLES2)!
let ciContext = CIContext(EAGLContext: glContext, options: [kCIContextOutputColorSpace : NSNull()])
Run Code Online (Sandbox Code Playgroud)

然后,我使用以下内容渲染图像:

let input = CIImage(image: UIImage(named: "DummyImage")!)!
ciContext.createCGImage(input, fromRect: input.extent)
Run Code Online (Sandbox Code Playgroud)

DummyImage只是一个示例图像文件.泄漏与此图像的大小直接相关,因此最好使用较大的泄漏以使问题更加明显.

正如你所看到的,我没有使用任何CIFilter(使用它们导致相同的结果),而且我没有捕获生成的图像(即使我捕获它,我也无法使用CGImageRelease,因为对象是自动管理的) .

如果渲染代码执行的次数足够多,则内存将增长太多,以至于正在运行的应用程序将被杀死.

一个有趣的观察是,销毁CIContext并没有什么区别,但是破坏EAGLContext确实会返回被占用的内存.这让我觉得泄漏发生在OpenGL方面.

我在代码中遗漏了哪些可能导致泄漏的内容?我是否可以通过电话来释放EAGLContext占用的内存?(一直重新创建它不是一种选择,因为它是一项昂贵的操作).


我创建了一个简单的项目来重现这个问题.您可以在以下位置找到它:

https://www.dropbox.com/s/zm19u8rmujv6jet/EAGLContextLeakDemo.zip?dl=0

重现的步骤是:

  1. 在设备上打开并运行附加的项目.
  2. 观察Xcode上的"Memory Report"屏幕.增长将在"使用比较"饼图的"其他流程"部分中看到.
  3. 该应用程序提供三个按钮.他们每个人都会执行一定次数的createCGImage命令(显示在按钮标签上).
  4. 点击任何按钮将导致"其他进程"的内存使用量增加.执行几个createCGImage调用后,这可能会更明显.
  5. 点击100 Renders按钮将更清楚地显示效果.
  6. 当内存增长过多时,应用程序将崩溃.

memory-leaks opengl-es core-image ios ios9

7
推荐指数
1
解决办法
2116
查看次数

如何从 SwiftUI 调用 PHPhotoLibrary presentLimitedLibraryPicker?

从 SwiftUI 调用 PHPhotoLibrary 的 presentLimitedLibraryPicker 方法的正确方法是什么?

该方法需要一个 UIViewController,而我在 SwiftUI 中没有。

我尝试使用 UIViewControllerRepresentable 来创建一个 UIViewController,它可以工作,但结果是呈现了两个视图控制器,一个是我用 UIViewControllerRepresentable 创建的,另一个是有限的库选择器。

两个视图控制器都需要关闭才能到达原始屏幕,这是不可取的。

总结一下我看到的问题:

  1. presentLimitedLibraryPicker 通过传递一个 ViewController 来工作。
  2. 这让我创建并呈现一个虚拟的 ViewController,以便我可以调用该方法。
  3. 无法获得对 Limited Library Picker 的引用,它也不提供委托。所以我无法检测到 Limited Library Picker 控制器何时被解除。

这是我的尝试(它显示了选择器,但是当您关闭它时,您也需要关闭额外的虚拟视图控制器:

import Foundation
import SwiftUI
import Photos
import PhotosUI

struct TestView: View {

   @State var showLibraryPicker = false

var body: some View {
    NavigationView {
        VStack {
            Button("Open Library Picker") { showLibraryPicker = true }
        }
        .navigationBarTitle("Test", displayMode: .inline)
        .navigationViewStyle(StackNavigationViewStyle())
        .sheet(isPresented: $showLibraryPicker, onDismiss: { print("Dismissed") }) …
Run Code Online (Sandbox Code Playgroud)

ios swiftui photosui

3
推荐指数
1
解决办法
1576
查看次数