目標(biāo):把NSDictionary對象轉(zhuǎn)換成NSMutableDictionary對象,對象內(nèi)容是字符串?dāng)?shù)組,需要實(shí)現(xiàn)完全復(fù)制(深復(fù)制)。
如果調(diào)用NSDictionary的mutableCopy方法,可以得到一個(gè)NSMutableDictionary對象,但這只是淺復(fù)制,如果我們修改NSDictionary中數(shù)組內(nèi)的值(當(dāng)然,數(shù)組必須是NSMutableArray),會發(fā)現(xiàn),NSMutableDictionary對象內(nèi)數(shù)組的值也跟著更改了。我們需要增加一個(gè)mutableDeepCopy方法來實(shí)現(xiàn)深復(fù)制,在該方法中,循環(huán)復(fù)制每一個(gè)元素。
要實(shí)現(xiàn)這一功能,有兩種方法,一是繼承,二是使用category。category與繼承的區(qū)別在于,使用category并不是新建一個(gè)類,而是在原類的基礎(chǔ)上增加一些方法(使用的時(shí)候還是用原類名),這樣,我們就不需要修改已經(jīng)在其他源文件中寫好的類名,只需要導(dǎo)入h頭文件,再把復(fù)制方法修改成我們新增的方法即可。
一、新建Objective-C category文件,我這Category填MutableDeepCopy,Category on填NSDictionary,所以生成的文件是NSDictionary+MutableDeepCopy.h和NSDictionary+MutableDeepCopy.m,生成的文件名很容易理解。
二、兩文件源代碼:
NSDictionary+MutableDeepCopy.h
- #import <Foundation/Foundation.h>
-
- @interface NSDictionary (MutableDeepCopy)
- -(NSMutableDictionary *)mutableDeepCopy;
- @end
NSDictionary+MutableDeepCopy.m:
- #import "NSDictionary+MutableDeepCopy.h"
-
- @implementation NSDictionary (MutableDeepCopy)
- -(NSMutableDictionary *)mutableDeepCopy
- {
- NSMutableDictionary *dict=[[NSMutableDictionary alloc] initWithCapacity:[self count]];
-
- NSArray *keys=[self allKeys];
- for(id key in keys)
- {
- id value=[self objectForKey:key];
- id copyValue;
- if ([value respondsToSelector:@selector(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
測試:
- #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;
- }