V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iOS 开发实用技术导航
NSHipster 中文版
http://nshipster.cn/
cocos2d 开源 2D 游戏引擎
http://www.cocos2d-iphone.org/
CocoaPods
http://cocoapods.org/
Google Analytics for Mobile 统计解决方案
http://code.google.com/mobile/analytics/
WWDC
https://developer.apple.com/wwdc/
Design Guides and Resources
https://developer.apple.com/design/
Transcripts of WWDC sessions
http://asciiwwdc.com
Cocoa with Love
http://cocoawithlove.com/
Cocoa Dev Central
http://cocoadevcentral.com/
NSHipster
http://nshipster.com/
Style Guides
Google Objective-C Style Guide
NYTimes Objective-C Style Guide
Useful Tools and Services
Charles Web Debugging Proxy
Smore
DingSoung
V2EX  ›  iDev

Swift 怎么手动释放内存?

  •  
  •   DingSoung ·
    DingSoung · 2017-08-10 18:02:44 +08:00 · 5924 次点击
    这是一个创建于 2669 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Swift 不支持 MRC 我的情况

    for  0..<1000 {
         creat image context
          get image
          end image context
    }
    

    在住线程上执行,context 要在循环执行完后在 runloop 上回收,这样 context 越来越多,内存会爆掉

    已经试过的办法

    for  0..<100 {
       autoreleasepool {
             creat image context
              get image
              end image context
        }
    }
    
    ```Swift
    for  0..<100 {
            creat image context
            get image
            end image context
           dispatch_async {
              context = nil
          }
    }
    

    我现在的做法是

    creat big image context
    for 0...100 {
       creat image 
       adjust context
    }
    end image context
    

    但是这样也是很有限的,image context 非常占内存 图片 4000 * 12000 的时候占到 200 多 MB

    所以不知道 iOS 有没有其他的 API, 可以生成超大的图(4000 * 100000) 但是可以一点一点的生成并写到文件,同时可以不断的手动创建对象和释放内存

    9 条回复    2017-08-13 10:38:27 +08:00
    ma125125t
        1
    ma125125t  
       2017-08-10 18:11:57 +08:00
    你这是要做 ML 吗?
    gggxxxx
        2
    gggxxxx  
       2017-08-10 18:42:42 +08:00 via iPhone
    swift 是 arc,arc 是 mrc 的傻瓜版,就是负值成 nil 就行了。
    obj = nil
    DingSoung
        3
    DingSoung  
    OP
       2017-08-10 19:02:47 +08:00
    @ma125125t 导出一个 table
    @gggxxxx 设置 nil 也不是立即释放的
    congeec
        4
    congeec  
       2017-08-10 21:56:27 +08:00 via iPhone
    我不用 swift,不过有点不明白。难道 context 出作用域,其引用计数不会-1 么?
    nicevar
        5
    nicevar  
       2017-08-11 10:43:06 +08:00
    gc 正常情况赋值空只是标记一下,本来就是不会立即释放的,系统会决定什么时候释放,所以就会有系统还没来得及释放回收的时候突然分配一块大的内存导致 crash 的情况
    lingoerer
        6
    lingoerer  
       2017-08-11 13:29:40 +08:00   ❤️ 2
    楼主给的信息实在是有限,没法确定楼主的问题出在哪里
    以下内容基于这么一个推测:即楼主要做的事情是通过大量计算自动地批量生成图片,图片的量大,且每张图片的尺寸也都非常大,而楼主使用的是 UIKit 中提供的类似 UIGraphicsBeginImageContext 和 UIGraphicsEndImageContext 之类的简单接口。
    一句话,这个问题没有简单无脑的解决方案,但稍微深入一下,办法却还是很多。
    1. UIKit/Foundation 中提供的接口并不适合做这件事情,这与语言无关,即使用 objc 通过 mrc 绕开 arc 的坑也是一样。性能非常堪忧。
    对于图片的绘制,楼主应该考虑使用 Metal 提供的 Compute Shader,将图片分阶段绘制到 MTLTexture 中。
    使用 Metal 确实存在一些门槛,如果不会的话,试试查阅一些第三方库,比如 https://github.com/BradLarson/GPUImage 说不定有提供对于你的需求现成的方法。
    2. 注意 Swift 中并不是不支持内存管理,Swift 其实提供有一系列类似 UnsafeBufferPointer 的工具来管理内存,楼主可以仔细读一下官方的文档:
    https://developer.apple.com/documentation/swift/manual_memory_management
    这一系列方法应该就是对楼主问题最直接的答案。
    3. 最后,出乎意料地,很多人并不知道许多 Unix C Level 的函数在 Swift 中是可以直接调用的(并不是私有 API ),比如 mmap ……
    https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man2/mmap.2.html
    具体例子我记得苹果去年的 ImageRecognition Demo 中有,使用 mmap 将神经网络的参数文件直接映射进内存空间,以节省内存使用,楼主这里可以反过来使用它来写文件(需要 Import Darwin )。
    DingSoung
        7
    DingSoung  
    OP
       2017-08-11 14:21:46 +08:00
    @lingoerer 确实,image context 基本用到极限了。得从图片编码得角度去分块处理。
    DingSoung
        8
    DingSoung  
    OP
       2017-08-11 14:23:35 +08:00
    @lingoerer 谢谢提供方向
    jessehao7
        9
    jessehao7  
       2017-08-13 10:38:27 +08:00
    1. 如果 swift 的 arc 和 obj-c 的 arc 一样的话,设 nil (=release,但!=dealloc )且引用计数减到 0 就确实是立即释放内存的,被标记的空间可以被复用。
    2. 不行的话就搞成 struct。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2706 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 07:31 · PVG 15:31 · LAX 23:31 · JFK 02:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.