美文网首页
Objective-C中集合对象的拷贝

Objective-C中集合对象的拷贝

作者: 11e17ad00a2a | 来源:发表于2017-10-19 14:11 被阅读14次

    废话少说,直接上code

    1.NSArray 与 copy

            MyClass *cls = [[MyClass alloc] init];
            cls.number = @(100);// default is 100
            
            // 1.NSArray 与 copy
            NSArray *array = [NSArray arrayWithObjects:@"Brooks",[NSURL URLWithString:@"https://github.com/BrooksWon"],cls,nil];
            NSArray *copy_array = [array copy];
            
            cls.number = @(200);
            
            NSLog(@"array:%p, cls.number = %@", array, cls.number);
            NSLog(@"copy_array:%p,  cls.number = %@", copy_array, cls.number);
        
    

    打印结果:

    结果显示:原始 array 和 copy_array 的地址相同,cls的地址相同。
    可以理解为:仅拷贝该NSArray实例对象的指针以及该集合里面存储对象的指针,不拷贝该集合里面存储对象的真实数据。常量数据对象除外;如:常量字符串、常量数字,如:NSString、NSSNumber 等。常量数据对象可以看作直接拷贝真实数据

    2.NSArray 和 mutableCopy

            cls.number = @(100); // reset
            
            // 2.NSArray 与 mutableCopy
            NSArray *mutableCopy_array = [array mutableCopy];
            
            cls.number = @(200);
            
            NSLog(@"array:%p, cls.number = %@", array, cls.number);
            NSLog(@"mutableCopy_array:%p,  cls.number = %@", mutableCopy_array, cls.number);
    
    

    打印结果:

    结果显示:原始 array 和 mutableCopy_array 的地址不同,cls的地址相同。
    可以理解为:拷贝该NSArray实例对象的指针地址 以及 该集合里面存储对象的指针,不拷贝该集合里面存储对象的真实数据。常量数据对象除外;如:常量字符串、常量数字,如:NSString、NSSNumber 等。常量数据对象可以看作直接拷贝真实数据

    3.NSMutableArray 与 copy

            NSMutableArray *mArray = [NSMutableArray arrayWithObjects:@"Brooks",[NSURL URLWithString:@"https://github.com/BrooksWon"],cls,nil];
            NSMutableArray *copy_mArray = [mArray copy];
            
            cls.number = @(200);
    
    
            NSLog(@"mArray:%p, cls.number = %@", mArray, cls.number);
            NSLog(@"copy_mArray:%p,  cls.number = %@", copy_mArray, cls.number);
    
    

    打印结果:

    结果显示:原始 mArray 和 copy_mArray 的地址不同,cls的地址相同
    可以理解为:仅拷贝该NSMutableArray实例对象的指针地址以及该集合里面存储对象的指,不拷贝该集合里面存储对象的真实数据。常量数据对象除外;如:常量字符串、常量数字,如:NSString、NSSNumber 等。常量数据对象可以看作直接拷贝真实数据

    4.NSMutableArray 与 mutableCopy

    
            NSMutableArray *mutableCopy_mArray = [mArray mutableCopy];
            
            cls.number = @(200);
    
            
            NSLog(@"mArray:%p, cls.number = %@", mArray, cls.number);
            NSLog(@"mutableCopy_mArray:%p,  cls.number = %@", mutableCopy_mArray, cls.number);       
    
    

    打印结果:

    结果显示:原始 mArray 和 mutableCopy_mArray 的地址不同,cls的地址相同
    可以理解为:仅拷贝该NSMutableArray实例对象的指针地址以及该集合里面存储对象的指针,不拷贝该集合里面存储对象的真实数据。常量数据对象除外;如:常量字符串、常量数字,如:NSString、NSSNumber 等 。常量数据对象可以看作直接拷贝真实数据。

    5.常量对象参与的copy、mutableCopy

    
            NSNumber *constNumberObject = @(123);
            NSString *constStringObject = @"abc";
            NSMutableString *enity = [NSMutableString stringWithFormat:@"999"];
    
            NSArray  *constObjectArray  = [NSArray arrayWithObjects:constNumberObject,constStringObject,enity, nil];
            
            NSArray *copy_constObjectArray = [constObjectArray copy];
            NSArray *mutableCopy_constObjectArray = [constObjectArray mutableCopy];
            
            constNumberObject = @(456);
            constStringObject = @"def";
            [enity setString:@"888"];
            
            NSLog(@"constObjectArray:%p", copy_constObjectArray);
            NSLog(@"copy_constObjectArray:%p", copy_constObjectArray);
            NSLog(@"mutableCopy_constObjectArray:%p", mutableCopy_constObjectArray);
            
    
    

    打印结果:

    结果显示:虽然 constNumberObjectconstStringObject 数据已经变化,但是 constObjectArray 中拷贝的数据没变。

    Demo地址

    如果是自定义对象要调用copy和mutableCopy方法,需要实现NSCopyingNSMutableCopying协议。

    相关文章

      网友评论

          本文标题:Objective-C中集合对象的拷贝

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