内存管理copy

2020-11-12  本文已影响0人  越天高

01

copy的目的就是为了产生一个新的副本对象,修改副本对象,不会对影响原来的对象
IOS提供了两个拷贝方法,

  1. copy不可变拷贝,产生不可变的副本
    2.mutablecCopy,产生可变的副本

        NSMutableString *testStr = [NSMutableString stringWithFormat:@"ddd"];
        NSString *str2 =  [testStr copy];//不可变
        NSMutableString *str3 = [testStr mutableCopy];//可变

02深拷贝和浅拷贝

通过copy产生的新的对象,相当于alloc出来的对象

 NSMutableString *testStr = [NSMutableString stringWithFormat:@"ddd"];
        NSString *str2 =  [testStr copy];//不可变
        NSMutableString *str3 = [testStr mutableCopy];//可变
        [testStr release];
        [str2 release];
        [str3 release
copy出来的新对象

copy的目的就是为了产生一个新的对象,修改互不影响,但是str1指向的是一个不可变的对象,所以copy出的也是一个不可变的对象,
不可变对象copy新的对象还是指向原来的对象,相当于return

  1. 深拷贝,内容拷贝会产生新的对象,
    2.浅拷贝,指针拷贝,不会产生新的对象

03taggedPointer与拷贝

如果字符串是taggedPointer,他就不是真正的对象,那么饮用计数就不存在

04NSArray和NSDictionary

        NSMutableArray *arr = [NSMutableArray array];
        NSArray *arr2 = [arr copy];//深拷贝
        NSMutableArray *arr3 = [arr mutableCopy];//深拷贝

NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:@"jack",@"name" ,nil];
        NSDictionary *dic2 = [dic copy];//浅拷贝
        NSMutableDictionary *dic3 = [dic mutableCopy];//深拷贝
copy和mutableCopy

可变对象调用mutableCopy肯定是深拷贝,
不可变对象调用copy是浅拷贝,其他都是深拷贝

05@property copy

- (void)setData:(NSData *)data
{
    if (_data != data)
    {
        [_data release];
        _data = [data copy];
    }
}

但是如果是个可变的数组,执行copy策略,会报错,因为他是一个深拷贝,会生成一个不可变的数组
创建IOS项目,字符串都是copy策略,他可以保证,这个字符串,肯定是不可变的,如果你想要改属性,就直接将整属性赋值一个新的文字,不希望他去修改原来的字符串

06 自定义copy

比如一个对象,已经有很多个属性被赋值,想直接生成一个新对象,含有他的那些属性值这时候就可以使用copy,
关于可变和不可变只存在foundation框架中的类,其他对象是没有的,属性都是通用的所有不存在可变的copy策略,
我们自定义的对象直接使用copy的话会报错,copyWithZone方法没有实现的错误,自定义的类要想copy首先需要遵守,NSCopying协议,然后实现copyWithZone方法

- (id)copyWithZone:(struct _NSZone *)zone
{
    Person *p = [[Person alloc] init];
    p.age = self.age;
    p.name = self.name;
    return p;
}

不存在mutableCopy策略

上一篇下一篇

猜你喜欢

热点阅读