NSDictionary细说(三)—— 字典的初始化

版本记录

版本号 时间
V1.0 2017.08.27

前言

NSDictionary是不可变字典,它的不可变性可以参考NSArray数组,但是它与数组还是有很大不同,尽管他们都属于集合类,下面这几篇我们继续来将一下基础类的知识。还是老规矩从整体到局部,从浅入深进行讲解,谢谢大家。感兴趣的可以参考我上面几篇。
1. NSDictionary细说(一)—— 整体了解
2. NSDictionary细说(二)—— 字典的创建

一、- (instancetype)init;

很常见的对象初始化,没什么说的了。

结论:简单到爆,但是还是列出来了。


二、- (NSDictionary<KeyType,ObjectType> *)initWithContentsOfFile:(NSString *)path;

这个和第二篇方法差不多,不多说了,直接给示例代码。

- (void)demoInitWithContentsOfFile
{
    NSDictionary *dict = [[NSDictionary alloc ] initWithContentsOfFile:@"/Users/lucy/Desktop/demo/JJOC/JJOC/Property List.plist"];
    NSLog(@"dict = %@", dict);
}

下面看输出结果

2017-08-27 21:29:48.311 JJOC[9040:284512] dict = {
    One = 1;
    Three = 3;
    Two = 2;
}

结论:从文件路径初始化字典。


三、- (NSDictionary<KeyType,ObjectType> *)initWithContentsOfURL:(NSURL *)url;

该方法的作用:从指定的URL实例化字典。

还要注意:

  • 初始化的字典 - 可能与原始接收器不同 - 包含aURL中的字典,或者如果存在错误或资源的内容是字典的无效表示,则为nil。
  • 由路径标识的文件中的字典表示只能包含属性列表对象(NSString,NSData,NSDate,NSNumber,NSArray或NSDictionary对象)

结论:根据指定URL实例化字典。


四、- (instancetype)initWithDictionary:(NSDictionary<KeyType,ObjectType> *)otherDictionary;

该方法的作用:根据给定的字典实例化新的字典。

下面看一下示例代码

- (void)demoInitWithDictionary
{
    NSDictionary *givenDict = @{@"One" : @"1", @"Two" : @"2"};
    NSDictionary *dict = [[NSDictionary alloc] initWithDictionary:givenDict];
    NSLog(@"dict = %@", dict);
}

看输出结果

2017-08-27 21:36:17.024 JJOC[9310:291355] dict = {
    One = 1;
    Two = 2;
}

结论:根据给定字典实例化字典。


五、- (instancetype)initWithDictionary:(NSDictionary<KeyType,ObjectType> *)otherDictionary copyItems:(BOOL)flag;

该方法的作用是:使用另一个给定字典中包含的对象初始化新分配的字典。

下面看一下参数和返回值:

  • otherDictionary:包含用于初始化新词典的键和值的字典。
  • flag:如果是YES,otherDictionary中的每个对象都会收到一个copyWithZone:消息来创建对象的副本必须符合NSCopying协议。 在托管内存环境中,这不是对象否则会接收到的保留消息。 然后将对象副本添加到返回的字典。如果否NO,则在受管内存环境中,otherDictionary中的每个对象在添加到返回的字典时都会收到一条保留消息。
  • return:一个初始化的对象 - 它可能与原始的接收器不同 - 包含在otherDictionary中找到的键和值。

还要注意:

  • 在这种不可变字典被初始化之后,它不能被修改。
    copyWithZone:方法执行浅拷贝。 如果你有一个任意深度的集合,那么对于flag参数传递YES就可以执行表面下面第一级的不可变拷贝。 如果您通过NO,第一级的可变性不受影响。 在任何一种情况下,所有更深层次的可变性都不受影响。

下面看示例代码

- (void)demoInitWithDictionaryCopyItems
{
    NSDictionary *givenDict = @{@"One" : @"1", @"Two" : @"2"};
    NSDictionary *dict = [[NSDictionary alloc] initWithDictionary:givenDict copyItems:NO];
    NSLog(@"dict = %@", dict);
}

下面看输出结果

2017-08-27 21:44:45.139 JJOC[9577:299298] dict = {
    One = 1;
    Two = 2;
}

结论:根据给定的字典,实例化新的字典,这里带flag标志位。


六、- (instancetype)initWithObjects:(NSArray<ObjectType> *)objects forKeys:(NSArray<id<NSCopying>> *)keys;

该方法和第二篇中的方法类似,都是根据指定的key和value数组实例化新的字典,这里只给出简单示例代码。

- (void)demoInitWithObjectsKeys
{
    NSArray *keys = @[@"One", @"Two"];
    NSArray *values = @[@1 , @2];
    NSDictionary *dict = [[NSDictionary alloc] initWithObjects:values forKeys:keys];
    NSLog(@"dict = %@", dict);
}

看输出结果

2017-08-27 21:48:26.338 JJOC[9717:301860] dict = {
    One = 1;
    Two = 2;
}

结论:根据键值数组实例化多个键值对的新字典。


七、- (instancetype)initWithObjects:(ObjectType _Nonnull const *)objects forKeys:(id<NSCopying> _Nonnull const *)keys count:(NSUInteger)cnt;

该方法和第二篇中的方法类似,都是根据C数组的键值和数目,实例化字典,这里只给出简单的示例代码。

- (void)demoInitWithObjectsCount
{
    static const NSInteger N_ENTRIES = 26;
    NSDictionary *asciiDict;
    NSString *keyArray[N_ENTRIES];
    NSNumber *valueArray[N_ENTRIES];
    NSInteger i;
    
    for (i = 0; i < N_ENTRIES; i++) {
        
        char charValue = 'a' + i;
        keyArray[i] = [NSString stringWithFormat:@"%c", charValue];
        valueArray[i] = [NSNumber numberWithChar:charValue];
    }
    
    asciiDict = [[NSDictionary alloc] initWithObjects:valueArray forKeys:keyArray count:N_ENTRIES];
    NSLog(@"asciiDict = %@", asciiDict);
}

下面看结果

2017-08-27 21:52:02.744 JJOC[9859:304372] asciiDict = {
    a = 97;
    b = 98;
    c = 99;
    d = 100;
    e = 101;
    f = 102;
    g = 103;
    h = 104;
    i = 105;
    j = 106;
    k = 107;
    l = 108;
    m = 109;
    n = 110;
    o = 111;
    p = 112;
    q = 113;
    r = 114;
    s = 115;
    t = 116;
    u = 117;
    v = 118;
    w = 119;
    x = 120;
    y = 121;
    z = 122;
}

结论:根据C数组键值对和数目,实例化新的字典。


八、- (instancetype)initWithObjectsAndKeys:(id)firstObject, ...;

该方法和第二篇所写类似,都是根据值和键对的排序,实例化新的字典,下面我们看示例代码。

- (void)demoInitWithObjectsAndKeys
{
    NSDictionary *dict = [[NSDictionary alloc] initWithObjectsAndKeys:@"value1", @"key1", @"value2", @"key2", nil];
    NSLog(@"dict = %@", dict);
}

看输出结果

2017-08-27 21:56:37.045 JJOC[10083:308134] dict = {
    key1 = value1;
    key2 = value2;
}

结论:根据有序的值键排序,实例化新的数组。

后记

简单的都感觉自己浪费时间了,但是为了照顾初学者还是不厌其烦的写了,希望对需要的人有所帮助,未完,待续~~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,723评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,485评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,998评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,323评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,355评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,079评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,389评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,019评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,519评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,971评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,100评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,738评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,293评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,289评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,517评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,547评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,834评论 2 345

推荐阅读更多精彩内容