内存管理-copy

copy分两种:copy和mutebleCopy

深浅拷贝

深拷贝:内容拷贝,生成新的地址
浅拷贝:指针拷贝,不会生成新的地址

1、为什么字符串都用copy

@property (copy, nonatomic) NSString *str;

用copy,可以保证字符串一直是不可变的

2、用copy修饰NSMutableArray

@property (copy, nonatomic) NSMutableArray *arr;

copy修饰,数组会返回不可变数组,不能add obj,一般用strong

3、mutableCopy只适用于存在Fundation里特定的对象,如表格中的那些,property属性中不直接使用

image.png

正确使用

NSMutableString *str1 = [NSMutableString stringWithFormat:@"test"];
NSMutableString *str2 = [str1 mutableCopy];

4、注意NSMutableString初始方式

NSMutableString *str1 = [[NSMutableString alloc] initWithFormat:@"test"]; // 1
NSString *str2 = [str1 copy]; // 深拷贝
NSMutableString *str3 = [str1 mutableCopy]; // 深拷贝
    
[str1 release];
[str2 release];
[str3 release];

但是

NSMutableString *str1 = [NSMutableString stringWithFormat:@"test"];
NSString *str2 = [str1 copy];//浅拷贝
NSMutableString *str3 = [str1 mutableCopy];//深拷贝
[str1 release];//会报错,因为是浅拷贝,指针拷贝,str1,str2指向同一个指针地址,不能release两次
[str2 release];
[str3 release];

NSMutableString的初始方式不同
[NSMutableString stringWithFormat:@"test"];相当于直接赋值一个字符串
[[NSMutableString alloc] initWithFormat:@"test"]生成了新地址

5、自定义的class类的不能直接使用copy,要使用必须Copy遵守NSCopying协议,实现-(id)copywithZone:(NSZone*)zone

@interface MJPerson : NSObject <NSCopying>
@property (assign, nonatomic) int age;
@property (assign, nonatomic) double weight;
@end
- (id)copyWithZone:(NSZone *)zone
{
    MJPerson *person = [[MJPerson allocWithZone:zone] init];
    person.age = self.age;
//    person.weight = self.weight;
    return person;
}

- (NSString *)description
{
    return [NSString stringWithFormat:@"age = %d, weight = %f", self.age, self.weight];
}

使用

MJPerson *p1 = [[MJPerson alloc] init];
p1.age = 20;
p1.weight = 50;

MJPerson *p2 = [p1 copy];
p2.age = 30;

NSLog(@"%@", p1);
NSLog(@"%@", p2);

[p2 release];
[p1 release];
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本文源自本人的学习记录整理与理解,其中参考阅读了部分优秀的博客和书籍,尽量以通俗简单的语句转述。引用到的地方如有遗...
    水中的蓝天阅读 410评论 0 3
  • NSString是一个不可变的字符串对象。这不是表示这个对象声明的变量的值不可变,而是表示它初始化以后,你不能改变...
    y2015阅读 177评论 0 0
  • 面试题引发的思考: Q: 谈一谈对copy、mutableCopy、浅拷贝、深拷贝的理解? copy:不可变拷贝,...
    hazydream阅读 726评论 1 0
  • Copy的目的 copy的目的,是希望能产生一个同样的副本。希望修改副本的时候,不会影响到原来的数据。修改原来的数...
    嗯o哼阅读 359评论 0 1
  • 我是黑夜里大雨纷飞的人啊 1 “又到一年六月,有人笑有人哭,有人欢乐有人忧愁,有人惊喜有人失落,有的觉得收获满满有...
    陌忘宇阅读 8,603评论 28 53