iOS中的copy你了解多少

在iOS开发中定义属性是经常要做的 这里呢 对于字符串来讲有点特殊 可能你已经写顺手了 在定义一个字符串的属性时 随手就这样写@property (nonatomic, strong) NSString *str; 哈哈 是不是 反正我写的挺习惯 哈哈 那么为啥 为啥这个字符串就要用copy呢 这里面有些学问

首先从字面上理解一下 copy 拷贝的意思 在iOS开发中copy包含两个意思(深拷贝, 浅拷贝)

深拷贝: 就是指新开辟一块内存 将拷贝的内容放到这快新开辟的内存
实现(三种):

NSString *str = @"nan";
NSMutableString *str1 = [[NSMutableString alloc] init];
str1.string = @"hard";
NSString *str2 = [str1 copy];
NSString *str3 = [str1 mutableCopy];
NSString *str4 = [str mutableCopy];
NSLog(@"%@--------------------%p", str, str);
NSLog(@"%@--------------------%p", str1, str1);
NSLog(@"%@--------------------%p", str2, str2);
NSLog(@"%@--------------------%p", str3, str3);
NSLog(@"%@--------------------%p", str4, str4);
D14A3400-AE51-4EE3-88CA-E77EE10C1204.png

大家看一下上面的打印地址 会发现上面的这几种copy后的地址都不一样 内容是一样的 我们成这种拷贝为深拷贝(深拷贝后 是开辟了一块新的内存 然后将内容复制到这块内存中)
总结一下 深拷贝一共可分3种形式:

  1. 对可变的string 进行copy
  2. 对可变的string 进行mutableCopy
  3. 对不可变的string 进行mutableCopy

浅拷贝: 拷贝的是指针 生成了另一个指针 页指向之前那块内存

NSString *str = @"yes";
NSString *str1 = [str copy];
NSLog(@"%@----------------%p", str, str);
NSLog(@"%@----------------%p", str1, str1);
A80FCE63-7BC6-4308-A751-DE3934BE72C6.png

细心的你会发现这里的str和str1的地址是一样的 所以说 浅拷贝之拷贝了指针 这是生成了两个指针并且指向同一块内存

那么 为什么在定义字符串属性时候就要用copy呢 我用strong不行吗(不行 哈哈) 下面我们来举例说明一下这个问题哈
// 定义一个strong修饰的字符串

@property (nonatomic, strong) NSString *nameStr;
// 创建一个不可变字符串给nameStr赋值
NSString *str = @"好的";
self.nameStr = str;
// 再改变str的值
str = @"一点不好";
NSLog(@"%@, %@", str, self.nameStr);
C5C315DB-1A93-49A4-B28C-48D2F0281CF3.png

从输出的结果来看 str值的改变并没有影响到nameStr的值

接下来我们再来看一个例子

@property (nonatomic, strong) NSString *nameStr;
// 创建一个可变的字符串来给nameStr赋值
NSMutableString *str = [NSMutableString   stringWithFormat:@"好的"];
self.nameStr = str;
str.string = @"一点不好";
NSLog(@"%@, %@", str, self.nameStr);
0434F20B-931A-4C9C-901F-7E22F939B89C.png

从输出结果你就可以清楚的看出 在使用可变字符串给strong修饰的字符串赋值时 改变这个可变字符串值得时候 nameStr也相应的改变 你可能并不希望这个nameStr随着那个可变的字符串改变 这时候就会出现一些不好的情况
但是你如果用copy来修饰字符串 就不会出现这个问题 用copy主要就是放置NSString被随意修改 如果NSString的赋值来源是NSString那么用copy和strong的效果是一样的 但是如果NSString的赋值来源是NSMutableString 用strong的话就会使NSString的值发生改变 这时用copy是深拷贝 生成一个新的对象 在改变NSMtableString的时候就不会影响到 NSString

总的来说 使用copy来修饰字符串 就是为了不影响可变字符串给字符串赋值时 产生的不良结果

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354

推荐阅读更多精彩内容