免费开源的iOS开发学习平台

OC对象复制:1-深复制与浅复制

一般来说,复制一个对象包括创建一个新的对象,并用原始对象中的值来初始化这个新的对象。复制非指针型的对象比较简单,例如int,float,BOOL等,均为值复制。复制指针型的对象有浅复制和深复制两种方法。

1、深复制与浅复制的简介

针对指针型对象的拷贝,有浅复制和深复制两种。

浅复制:将原始对象的指针值复制到副本中,即指针复制,原始对象和副本共享引用的数据;相当于创建了一个文件的快捷方式。

深复制:复制原始对象指针所引用的数据,并将其赋给副本对象,即内容复制,相当于创建了一份新的文件。

例如,当我们为一个类的属性添加copy关键字时,那么对这个属性赋值时(即:调用setter方法),就会执行深拷贝操作,同时还需要改类遵守NSCopying协议。当我们把属性关键字改为strong或者weak时,那么对这个属性赋值时,就会执行浅拷贝(只拷贝指针地址)。

2、示例代码

  • 新增一个ClassA类,并添加一个NSString类型的name属性,并添加copy关键字。另外,NSString类已经遵守了NSCopying协议。
#import <Foundation/Foundation.h>
 
@interface ClassA : NSObject 
 
@property (nonatomic, copy) NSString * name;
 
@end
  • 在main.m文件中添加如下函数,并调用;
void copyTest () {
    NSMutableString *string = [[NSMutableString alloc] initWithFormat:@"www.99ios.com"];
    
    ClassA *classA = [[ClassA alloc] init];
    
    classA.name = string;
 
    [string appendString:@"+"];
    
    NSLog(@"string : %@  address: %p", string ,string);
    NSLog(@"copy Property : %@  address: %p", classA.name ,classA.name);
    
}
  • 运行结果如下,可以看到内存地址不同,并且指向不同的字符串。

  • 接下来,修改属性关键字为strong,如下:
#import <Foundation/Foundation.h>
 
@interface ClassA : NSObject 
 
@property (nonatomic, strong) NSString * name;
 
@end
  • 再次运行后,运行结果如下。可以看到执行复制操作的对象和原始对象指向同一个内存地址,修改字符串的内容后,复制对象和原始对象的值相同。

示例代码

https://github.com/99ios/6.1.1