iOS/Objective-C開發 字典NSDictionary的深複製

iOS/Objective-C開發 字典NSDictionary的深複製(使用category)

目標:把NSDictionary對象轉換成NSMutableDictionary對象,對象內容是字符串數組,需要實現完全複製(深複製)。
如果調用NSDictionary的mutableCopy方法,可以得到一個NSMutableDictionary對象,但這只是淺複製,如果我們修改NSDictionary中數組內的值(當然,數組必須是NSMutableArray),會發現,NSMutableDictionary對象內數組的值也跟着更改了。我們需要增加一個mutableDeepCopy方法來實現深複製,在該方法中,循環複製每一個元素。
要實現這一功能,有兩種方法,一是繼承,二是使用category。category與繼承的區別在於,使用category並不是新建一個類,而是在原類的基礎上增加一些方法(使用的時候還是用原類名),這樣,我們就不需要修改已經在其他源文件中寫好的類名,只需要導入h頭文件,再把複製方法修改成我們新增的方法即可。
一、新建Objective-C category文件,我這Category填MutableDeepCopy,Category on填NSDictionary,所以生成的文件是NSDictionary+MutableDeepCopy.h和NSDictionary+MutableDeepCopy.m,生成的文件名很容易理解。
二、兩文件源代碼:
NSDictionary+MutableDeepCopy.h

1
2
3
4
5
6
#import <Foundation/Foundation.h>
 
@interface NSDictionary (MutableDeepCopy)
-(NSMutableDictionary *)mutableDeepCopy;
//增加mutableDeepCopy方法
@end

NSDictionary+MutableDeepCopy.m:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#import "NSDictionary+MutableDeepCopy.h"
 
@implementation NSDictionary (MutableDeepCopy)
-(NSMutableDictionary *)mutableDeepCopy
{
    NSMutableDictionary *dict=[[NSMutableDictionary alloc] initWithCapacity:[self count]];
    //新建一個NSMutableDictionary對象,大小爲原NSDictionary對象的大小
    NSArray *keys=[self allKeys];
    for(id key in keys)
    {//循環讀取複製每一個元素
        id value=[self objectForKey:key];
        id copyValue;
        if ([value respondsToSelector:@selector(mutableDeepCopy)]) {
            //如果key對應的元素可以響應mutableDeepCopy方法(還是NSDictionary),調用mutableDeepCopy方法複製
            copyValue=[value mutableDeepCopy];
        }else if([value respondsToSelector:@selector(mutableCopy)])
        {
            copyValue=[value mutableCopy];
        }
        if(copyValue==nil)
            copyValue=[value copy];
        [dict setObject:copyValue forKey:key];
 
    }
    return dict;
}
@end

測試:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#import <Foundation/Foundation.h>
#import "NSDictionary+MutableDeepCopy.h"
//導入頭文件
int main (int argc, const char * argv[])
{
 
    @autoreleasepool {
        NSMutableArray *arr1=[[NSMutableArray alloc] initWithObjects:@"aa",@"bb",@"cc", nil];
        NSDictionary *dict1=[[NSDictionary alloc] initWithObjectsAndKeys:arr1,@"arr1", nil];
        NSLog(@"%@",dict1);
        NSMutableDictionary *dict2=[dict1 mutableCopy];
        //淺複製
        NSMutableDictionary *dict3=[dict1 mutableDeepCopy];
        //深複製
        [arr1 addObject:@"dd"];
        NSLog(@"%@",dict2);
        NSLog(@"%@",dict3);
 
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章