美文网首页
沙盒和NSBundle的区别

沙盒和NSBundle的区别

作者: JohnHua | 来源:发表于2017-07-26 11:21 被阅读0次

    1 沙盒和NSBundle的区别

    沙盒(NSHomeDirectory()) 是系统加载 app时,为 app 分配的存储空间。如本地数据库,文件存储;

    NSBundle 是系统加载 app时,app 的可执行代码和这些代码需要的资源文件所在的目录;

    下面打印出他们的地址。

    注意:每次打印出的地址都是不同的

    - (void)viewDidLoad {

    [super viewDidLoad];

    NSLog(@"bundle: %p", [[NSBundle mainBundle] infoDictionary]);

    NSLog(@"home: %p", NSHomeDirectory());

    NSLog(@"code: %p", self);

    NSLog(@"bundle: %@", [[NSBundle mainBundle] bundlePath]);

    NSLog(@"home: %@", NSHomeDirectory());

    NSString *content = @"my file content";

    NSError *error;

    BOOL isRight = NO;

    isRight = [content writeToFile:[[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent:@"file1.txt"]

    atomically:YES

    encoding:NSUTF8StringEncoding

    error:&error];

    if (!isRight) {

    NSLog(@"write to bundle error: %@", error.localizedDescription);

    }

    isRight = [content writeToFile:[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject stringByAppendingPathComponent:@"file1.txt"]

    atomically:YES

    encoding:NSUTF8StringEncoding

    error:&error];

    if (!isRight) {

    NSLog(@"write to home dir error: %@", error.localizedDescription);

    }

    }

    模拟器中输出:

    第 1 次运行:

    2017-07-26 10:38:41.307 Harvest[2236:541410] bundle: 0x600000065380

    2017-07-26 10:38:41.307 Harvest[2236:541410] home: 0x7fd6d65043d0

    2017-07-26 10:38:41.307 Harvest[2236:541410] code: 0x7fd6d650d820

    2017-07-26 10:38:41.308 Harvest[2236:541410] bundle: /Users/longhua/Library/Developer/CoreSimulator/Devices/2CB55BFD-8176-4ADC-99D6-5280D7BCCF1B/data/Containers/Bundle/Application/817CFB68-19FE-4D58-960F-68F72BE236B7/Harvest.app

    2017-07-26 10:38:41.308 Harvest[2236:541410] home: /Users/longhua/Library/Developer/CoreSimulator/Devices/2CB55BFD-8176-4ADC-99D6-5280D7BCCF1B/data/Containers/Data/Application/E1D22141-A32F-468E-91D5-307BD82FA251

    第 2 次运行:

    2017-07-26 10:39:13.476 Harvest[2273:544438] bundle: 0x608000261040

    2017-07-26 10:39:13.476 Harvest[2273:544438] home: 0x7f83b470cbb0

    2017-07-26 10:39:13.476 Harvest[2273:544438] code: 0x7f83b450e460

    2017-07-26 10:39:13.477 Harvest[2273:544438] bundle: /Users/longhua/Library/Developer/CoreSimulator/Devices/2CB55BFD-8176-4ADC-99D6-5280D7BCCF1B/data/Containers/Bundle/Application/05F27F47-8384-40A7-9FDF-451255E282B3/Harvest.app

    2017-07-26 10:39:13.477 Harvest[2273:544438] home: /Users/longhua/Library/Developer/CoreSimulator/Devices/2CB55BFD-8176-4ADC-99D6-5280D7BCCF1B/data/Containers/Data/Application/D91EC197-590D-4538-9651-435056AB5D19

    真机中输出:

    第 1 次运行:

    2017-07-26 10:33:04.426597+0800 Harvest[7963:2911220] bundle: 0x17007b8c0

    2017-07-26 10:33:04.426826+0800 Harvest[7963:2911220] home: 0x17414e650

    2017-07-26 10:33:04.426857+0800 Harvest[7963:2911220] code: 0x14de0ed10

    2017-07-26 10:33:04.426885+0800 Harvest[7963:2911220] bundle: /var/containers/Bundle/Application/0FF63C1B-80CC-4C79-9119-3EABE8D61F14/Harvest.app

    2017-07-26 10:33:04.427091+0800 Harvest[7963:2911220] home: /var/mobile/Containers/Data/Application/EA36910B-A24D-48BD-A657-561247429851

    2017-07-26 10:33:04.446798+0800 Harvest[7963:2911220] write to bundle error: 您没有将文件“file1.txt”存储到文件夹“丰收app”中的权限。

    第 2 次运行:

    2017-07-26 10:35:51.724381+0800 Harvest[7969:2912283] bundle: 0x17007c7c0

    2017-07-26 10:35:51.724596+0800 Harvest[7969:2912283] home: 0x174150490

    2017-07-26 10:35:51.724627+0800 Harvest[7969:2912283] code: 0x145e0e4e0

    2017-07-26 10:35:51.724655+0800 Harvest[7969:2912283] bundle: /var/containers/Bundle/Application/36A3A0D0-B007-45B1-8672-7A9195CEDBF5/Harvest.app

    2017-07-26 10:35:51.724857+0800 Harvest[7969:2912283] home: /var/mobile/Containers/Data/Application/BDAA6308-C671-4022-B97C-F8EFE36CE746

    2017-07-26 10:35:51.740230+0800 Harvest[7969:2912283] write to bundle error: 您没有将文件“file1.txt”存储到文件夹“丰收app”中的权限。

    显示 Harvest.app 的包内容:

    打开 NSHomeDirectory() 中的内容:

    结果分析:

    (1)bundle 中有个 info.plist 文件,是 app 的配置文件;沙盒的 Library / Preferences 中有个 com.god.harvest.plist 文件,它用于 UserDefault 存储;

    另:使用 xcode > Devices 下载 app 的 container 内容,会看到主要就是 沙盒中的内容,再加上一个 AppDataInfo.plist(就是 info.plist).

    (2)模拟器中,可以通过 writeToFile 向 沙盒 和 Bundle 中 写入文件;真机中是不能向 Bundle 中写入文件的;

    官方文档中说明(地址:https://developer.apple.com/library/content/documentation/CoreFoundation/Conceptual/CFBundles/AccessingaBundlesContents/AccessingaBundlesContents.html#//apple_ref/doc/uid/10000123i-CH104-SW1):

    • A package is any directory that the Finder presents to the user as if it were a single file.

    • A bundle is a directory with a standardized hierarchical structure that holds executable code and the resources used by that code.

    相关文章

      网友评论

          本文标题:沙盒和NSBundle的区别

          本文链接:https://www.haomeiwen.com/subject/ntsnkxtx.html