美文网首页
内存管理copy

内存管理copy

作者: 越天高 | 来源:发表于2020-11-12 20:20 被阅读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策略

相关文章

  • 内存管理-copy

    拷贝的作用 拷贝的作用就是为了产生一个副本对象,与原对象互不影响 修改了原对象,不会影响副本对象 修改了副本对象,...

  • 内存管理:Copy

    Copy的目的 copy的目的,是希望能产生一个同样的副本。希望修改副本的时候,不会影响到原来的数据。修改原来的数...

  • 内存管理copy

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

  • 内存管理-copy

    copy分两种:copy和mutebleCopy 深拷贝:内容拷贝,生成新的地址浅拷贝:指针拷贝,不会生成新的地址...

  • Lesson 0-1 Objective-C basic

    6.OC 手动内存管理 OC 内存管理原则: 只要使用 alloc, new, copy, mutableCopy...

  • iOS 内存(系统引用的技术)了解

    iOS程序的内存布局 Tagged Pointer OC对象的内存管理 copy和mutableCopy

  • Block内存管理

    对block自身内存的管理 对于block,有两个内存管理方法:Block_copy, Block_release...

  • OC语言day08-18Copy的内存管理

    pragma mark Copy的内存管理 pragma mark 概念 pragma mark 代码

  • Copy内存管理原则

    Copy内存管理原则一次alloc 对应一次release一次retain 对应一次release一次copy 对...

  • 内存管理 之 Copy

    1、copy copy的目的:产生一个副本对象,跟源对象互不影响,修改一方时,不会影响另一方。copy分为深拷贝和...

网友评论

      本文标题:内存管理copy

      本文链接:https://www.haomeiwen.com/subject/lvglbktx.html