iOS的集合深拷貝

集合的遞歸深拷貝

關(guān)于拷貝的一些概念在iOS集合的深復制與淺復制里 講得很清楚啦.
我在這里想說的是遞歸深拷貝:

copy只做第一級的深拷貝。 如果array里面存的是指針,它就會把指針值做深拷貝,等于是后面的數(shù)組跟前面的數(shù)組,存的指針值是一樣的,但是指針指向的內(nèi)容不做深拷貝,所以改了指針指向的內(nèi)容,會同時影響兩個數(shù)組。

如果需要每一層都深拷貝的話:

NSMutableArray* a = [NSMutableArray arrayWithObjects:@"123",@"345", nil];

NSMutableArray* b = [NSMutableArray arrayWithObjects:@"xyz",@"abc", nil];

NSArray *c = [NSArray arrayWithObjects:a, b, nil];

NSArray *d = [c copyDeeply]; // 深拷貝

    for (NSArray* arr in d) {

        for (NSString* s in arr) {

            NSLog(@"element: %@", s);

        }

    }

    

    a[0] = @"haha";

    

    for (NSArray* arr in d) {

        for (NSString* s in arr) {

            NSLog(@"element: %@", s);

        }

    }

結(jié)果:

2017-04-05 11:26:23.688 Test[1341:101216] element: 123
2017-04-05 11:26:23.688 Test[1341:101216] element: 345
2017-04-05 11:26:23.688 Test[1341:101216] element: xyz
2017-04-05 11:26:23.688 Test[1341:101216] element: abc
2017-04-05 11:26:23.689 Test[1341:101216] element: 123
2017-04-05 11:26:23.689 Test[1341:101216] element: 345
2017-04-05 11:26:23.689 Test[1341:101216] element: xyz
2017-04-05 11:26:23.689 Test[1341:101216] element: abc

******************************************

NSArray 遞歸深拷貝

- (id)copyDeeply {

    NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:[self count]];
    [self enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        id item = obj;
        if ([item respondsToSelector:@selector(copyDeeply)]) {
            item = [item copyDeeply];
        } else {
            item = [item copy];
        }
        if (item) {
            [array addObject:item];
        }
    }];
    return [NSArray arrayWithArray:array];
}

- (id)mutableCopyDeeply {

    NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:[self count]];
    [self enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        id item = obj;
        if ([item respondsToSelector:@selector(mutableCopyDeeply)]) {
            item = [item mutableCopyDeeply];
        } else if ([item respondsToSelector:@selector(mutableCopyWithZone:)]) {
            item = [item mutableCopy];
        } else {
            item = [item copy];
        }
        if (item) {
            [array addObject:item];
        }
    }];
    return array;
}

NSDictionary 遞歸深拷貝


- (id)copyDeeply {
    
    NSMutableDictionary *dic = [[NSMutableDictionary alloc] initWithCapacity:[self count]];
    [self enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
        id item = obj;
        if ([item respondsToSelector:@selector(copyDeeply)]) {
            item = [item copyDeeply];
        } else {
            item = [item copy];
        }
        if ( item && key ) {
            [dic setObject:item forKey:key];
        }
    }];
    return [NSDictionary dictionaryWithDictionary:dic];
}

- (id)mutableCopyDeeply {
    
    NSMutableDictionary *dic = [[NSMutableDictionary alloc] initWithCapacity:[self count]];
    [self enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
        id item = obj;
        if ([item respondsToSelector:@selector(mutableCopyDeeply)]) {
            item = [item mutableCopyDeeply];
        } else if ([item respondsToSelector:@selector(mutableCopyWithZone:)]) {
            item = [item mutableCopy];
        } else {
            item = [item copy];
        }
        if ( item && key ) {
            [dic setObject:item forKey:key];
        }
    }];
    return dic;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容