第08天OC语言(17):Copy基本使用(深浅拷贝)

  • 不要等到明天,明天太遥远,今天就行动。
须读:看完该文章你能做什么?

Copy的基本概念

学习前:你必须会什么?(在这里我已经默认你具备C语言的基础了)

NSString的基本使用


一、本章笔记
一、Copy
    为什么会 产生一个新的对象
    拷贝要求 修改原来的对象不能影响到拷贝出来的对象
    修改拷贝出来的对象 也不能影响到原来的对象, 所以需要生成一个新的对象
 
    深浅拷贝
    如果没有生成新的对象, 我们称之为浅拷贝, 本质就是指针拷贝
    如果生成了新的对象, 我们称之为深拷贝, 本质就是会创建一个新的对象

二、code
main.m
#pragma mark 17-Copy基本使用(深浅拷贝)
#pragma mark - 代码
#import <Foundation/Foundation.h>
#pragma mark 类

#pragma mark - main函数
int main(int argc, const char * argv[])
{
#pragma 1.不可变字符串 进行一个 mutableCopy操作
    // 会生成一个新的对象
    /*
    NSString *str = @"lyh";
    // 只要是拷贝出来的对象,拷贝出来的对象中的内容 和 以前对象中的内容一致
    // "一般"情况下 拷贝会生成一个新的对象
    // 为什么会 产生一个新的对象 1.因为拷贝要求 修改原来的对象不能影响到拷贝出来的对象 \
                            修改拷贝出来的对象 也不能影响到原来的对象, 所以需要生成一个新的对象 \
                            2.由于以前的对象是一个不可变的对象,而通过mutableCopy拷贝出来的对象必须是一个可变的对象,所以必须生成一个新的对象
    
    NSMutableString *copyStr = [str mutableCopy];
    NSLog(@"str = %@, copyStr = %@",str,copyStr);
    NSLog(@"str = %p, copyStr = %p",str,copyStr);
     */
    
#pragma 2.可变字符串 进行一个 mutableCopy操作
    // 会生成一个新的对象
    /*
    NSMutableString *str = [NSMutableString stringWithFormat:@"lyh"];
    NSMutableString *copyStr = [str mutableCopy];
    [str appendString:@"c"];
    NSLog(@"str = %@, copyStr = %@",str,copyStr);
    NSLog(@"str = %p, copyStr = %p",str,copyStr);
     */
    
#pragma 3. 可变字符串 进行一个 copy
    // 会生成一个新的对象

    /*
    NSMutableString *str = [NSMutableString stringWithFormat:@"lyh"];
    NSString *copyStr = [str copy];
    [str appendString:@"c"];
    NSLog(@"str = %@, copyStr = %@",str,copyStr);
    NSLog(@"str = %p, copyStr = %p",str,copyStr);
     */
#pragma 4.如果是通过 不可变对象调用了copy , 那么不会生成一个新的对象
    // 原因: 因为原来的对象是不能修改的,拷贝出来的对象 也是不能修改的
    // 既然两个 都不能修改, 所以永远不能影响到另外一个对象, 那么已经符合需求
    // 所以 : OC为了内存进行优化, 就不会生成一个新的对象
    NSString *str = @"lyh";
    NSString *copyStr = [str copy];
    NSLog(@"str = %p, copyStr = %p",str,copyStr); // 同一个地址

    
    /*
     正式因为调用copy方法 有时候 会生成一个新的对象,有时候不会生成一个新的对象
     所以 : 如果没有生成新的对象, 我们称之为浅拷贝, 本质就是指针拷贝
            如果生成了新的对象, 我们称之为深拷贝, 本质就是会创建一个新的对象
     
     */
    return 0;
}

推荐阅读更多精彩内容