深复制/浅复制

ClassA.h

#import <Foundation/Foundation.h>
@interface ClassA : NSObject
@property (nonatomic,weak) NSString *name;
@end

main.m

#import <Foundation/Foundation.h>
#import "ClassA.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSMutableString *str = [[NSMutableString alloc]initWithString:@"www.google.com"];
        ClassA *classA = [[ClassA alloc] init];
        classA.name = str;
        [str appendString:@" plus"];
        NSLog(@"%@, %p", classA.name, classA.name);
        NSLog(@"%@, %p", str, str);
    }
    return 0;
}   

输出结果:

www.google.com plus, 0x100406aa0
www.google.com plus, 0x100406aa0

如果把weak或strong改为copy,由浅复制变成深复制

@property (nonatomic,weak) NSString *name;
@property (nonatomic,copy) NSString *name;

输出结果:

www.google.com, 0x7fff79f8d3c0
www.google.com plus, 0x100406aa0

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

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

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

    NSString *string = @"test";
    NSString *string1 = [string copy];
    NSString *string2 = [string mutableCopy];

copy->复制指针(创建一个指针指向原始的内存地址)
mutableCopy->复制指针及内容(创建新的内存地址)

string:[0x100001058]test
string1:[0x100001058]test
string2:[0x100201600]test
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1. 属性中copy与strong特性的区别 在开始学习浅复制(Shallow Copy)、深复制(Deep Co...
    pro648阅读 5,819评论 2 16
  • 307、setValue:forKey和setObject:forKey的区别是什么? 答:1, setObjec...
    AlanGe阅读 5,519评论 0 1
  • “我那次想 要是能一睡不醒就好了” “哪次阿你这是有多困” “梦到他的那次。”
    芮小芮阅读 2,910评论 0 2
  • 好多的人,好多的事,好多的经历,好多的文章,需要时间的沉淀,像酒,越久越醇。 第一次接触卡佛的作品,快看完了,真的...
    lily妮妮阅读 1,675评论 0 0
  • 14-4-43 大学两年时间的学习告诉我们,我们应该关注幼儿的身心健康快乐成长,应当让他们在玩中学,游戏是幼儿学习...
    slide_阅读 1,850评论 1 7

友情链接更多精彩内容