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
文章发布时间为: August 22nd , 2016 at 04:51 pm
最后编辑时间为: September 6th , 2017 at 10:50 am
本文由 99ios 创作,转载请注明出处
最后编辑时间为: September 6th , 2017 at 10:50 am
本文由 99ios 创作,转载请注明出处