V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
2232588429
V2EX  ›  iOS

ios 在不同 app 之间分享文件会不会增加设备占用空间?

  •  
  •   2232588429 · 51 天前 via iPhone · 1900 次点击
    这是一个创建于 51 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如我已经在一款读书软件里打开了一个图书文件,把它分享到另一个读书软件里打开,设备的总空间占用会增加吗?

    20 条回复    2024-05-06 00:12:31 +08:00
    beimenjun
        1
    beimenjun  
       51 天前   ❤️ 3
    一般情况下会增加,因为这相当于文件从一个 App 的沙盒,传到了另外一个 App 的沙盒里。
    SenLief
        2
    SenLief  
       51 天前
    应该是会的
    1145148964
        3
    1145148964  
       51 天前
    即使是一楼说的情况。我记得 ios 存储系统是有去重的
    beimenjun
        4
    beimenjun  
       51 天前
    @1145148964 系统不会管你沙盒里两份文件是不是一样的。不存在什么去重。
    zhigang1992
        5
    zhigang1992  
       51 天前
    APFS 在文件系统层级 Copy-on-Write 。 是不会占用更多空间的,只有在修改文件内容的时候会 Duplicate 一份再修改
    dadadadaadada
        6
    dadadadaadada  
       51 天前 via iPhone
    同疑惑,因为删掉一个 app 里的文件,对另一个 app 无影响
    dilidilid
        7
    dilidilid  
       51 天前 via iPhone
    beimenjun 的说法是错误的,APFS 作为 CoW 文件系统支持 copy by reflink ,这跟去重是两码事。如果从外部往 APFS 里复制两个一样的文件 APFS 是不会自动触发去重的所以会增加占用,但在 APFS 里内部复制是不会增加空间占用的,即使后续有修改操作也只增加修改部分的体积,这个 feature 是在引入 APFS 的时候专门强调的优点
    dilidilid
        8
    dilidilid  
       51 天前 via iPhone   ❤️ 1
    @zhigang1992 修改文件内容只会增加 modified content 对应的 block ,并不会整个文件 duplicate
    ProvinceV
        9
    ProvinceV  
       51 天前
    APFS ( macOS 、iOS 等 Apple 设备使用的文件系统)支持 Clones 和拆分编码(增量编码,Delta encoding )。

    > Clones allow the operating system to make efficient file copies on the same volume without occupying additional storage space. Changes to a cloned file are saved as delta extents, reducing storage space required for document revisions and copies.
    https://en.wikipedia.org/wiki/Apple_File_System
    hheng101
        10
    hheng101  
       51 天前
    我记得 APFS 和 iOS 的内存管理有点像,有类似的引用计数功能来去重
    dooogle
        11
    dooogle  
       51 天前 via iPhone   ❤️ 3
    微信:我不管,我就复制多一份
    beimenjun
        12
    beimenjun  
       51 天前
    @zhigang1992 @dilidilid 作为 iOS App 开发,稍微解释一下我的看法吧。

    当文件通过分享过来的时候,使用 AppDelegate/SceneDelegate 来管理周期的 iOS 应用,使用的是类似 application(_:open:options:) 方法来响应,这一步系统会传来一个 url ,然后接收方可以通过这个 URL 来读取文件的 Data 。

    但是在 OP 举的这个例子里,市面上正常点的 PDF 阅读器,都会把 Data 保存为 PDF 格式到自己的沙盒里。除非有谁写了接收 PDF 分享过来,但是不做持久化保存,只存在内存里。

    所以一般情况下会增加。

    ---------------

    这个问题还可以延展出来,比如开发者也许可以保存系统提供 URL 到数据库里,以供下次使用?我个人是不建议。因为这个 URL 可能系统重启了就没了。
    0TSH60F7J2rVkg8t
        13
    0TSH60F7J2rVkg8t  
       51 天前
    @dooogle 可不止多一份
    chengYT
        14
    chengYT  
       51 天前
    不会,iOS10 引入了 apfs 解决了你说的这个问题,你可以试一下 iOS9 的老机器分享个大文件去 QQ 或者微信,再弹出分享界面之前是要有一段时间没反应的,就是在复制文件,iOS10 之后就不需要了
    lixuehan123
        15
    lixuehan123  
       51 天前 via iPhone
    删除的时候呢?还保留了一份啊
    AceRacer
        16
    AceRacer  
       50 天前 via Android
    @beimenjun 你这 iOS 开发技术不过关呀,是两个相同的文件,但是只占一份存储空间 https://sspai.com/post/38377
    beimenjun
        17
    beimenjun  
       50 天前
    @AceRacer 自己看代码去调试吧……

    https://github.com/zizicici/Duplicator
    beimenjun
        18
    beimenjun  
       50 天前   ❤️ 1
    @chengYT @hheng101 @dilidilid @zhigang1992 @AceRacer @1145148964

    请到 https://github.com/zizicici/Duplicator 里自取代码,跑一下测试一下。看看你们说的是不是正确的。

    -------------------

    所谓 iOS 10.3 blabla APFS blabla 的,其实对于这个场景是不奏效的。

    你们说的场景可能在一个沙盒内部的某些情况会奏效,但是对于通过系统控件 Sharing 到另外一个 App 是没有用的。

    大概的流程是 iOS 系统把分享的文件先投递到 Receiver 的 Documents/Inbox 处,这时候文件已经进入 Receiver 的沙盒里了,然后 Receiver 在 `scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>)` 处进行处理。

    甚至 Receiver 这一步处理中,你选择将 URL 里的 data 直接读取再转存,会再增加数据的体积。

    ---------------------

    另外因为每个 Documents/Inbox 是有可能因为空间不够,被系统删除。所以正常靠谱点的 App ,如果有需要会将 Inbox 里的文件挪到自己沙盒里设计好的位置。

    ---------------------

    附录:

    测试内容:

    我这边用了一个 1.53 G 的文件测试。

    在分享前:

    Sender 占用体积 1.54G ,Receiver 占用体积 300K 。
    iOS 可用空间比之前少了 1.5G 左右,符合两个应用加起来的体积。

    在分享后:

    Sender 占用体积 1.54G ,Receiver 占用体积 1.53G 。
    iOS 可用空间比之前少了 3.1G 左右,符合两个应用加起来的体积。
    AceRacer
        19
    AceRacer  
       50 天前 via Android
    @beimenjun 你是正确的,这些科技自媒体乱写文章误导人,mac 端还有 iPhone 自带的一些应用内部是共用的,三方 app 直接还是独立的拷贝,你是专业的 iOSer
    voidless
        20
    voidless  
       50 天前
    @beimenjun 支持你,很多人空对空分析一大堆,和实际情况具体场景相差十万八千里
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1840 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 16:32 · PVG 00:32 · LAX 09:32 · JFK 12:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.