zoukankan      html  css  js  c++  java
  • NSarray 赋值 拷贝 等问题记录

    1.

    NSArray * a1 = @[@"1",@"2",@"3"];

    NSArray * a2 = a1;

    a1跟a2所指向的地址是一样的  

    NSLog(@"a1:%p a2:%p a1p:%p a2p:%p",&a1,&a2,a1,a2);

    2.

    NSArray * a1 = @[@"1",@"2",@"3"];

    NSArray * a2 = [a1 copy];

    NSLog(@"a1:%p a2:%p a1p:%p a2p:%p",&a1,&a2,a1,a2);

    a1跟a2所指向的地址是一样的 ,所以对于不可变的NSArray 来说,copy只是简单的增加一个持有者,并没有重新开一份地址。

    3.

    NSArray * a1 = @[@"1",@"2",@"3"];

    NSArray * a2 = [a1 mutableCopy];

    NSLog(@"a1:%p a2:%p a1p:%p a2p:%p",&a1,&a2,a1,a2);

    a1跟a2所指向的地址也是不一样的 ,也就是说a2是a1的一份拷贝

    4.

    NSMutableString * str1 = [NSMutableString stringWithFormat:@"123"];

    NSMutableString * str2 = [NSMutableString stringWithFormat:@"abc"];

    NSArray * a1 = @[str1,str2];

    [a1[0] appendString:@"456"];

    a1是不可操作的,你不可能操作比如a1[0] = @"1";因为a1是不可变的,但是a1内的变量是否可变就由不得a1控制了,比如str1是一个可变的string,那它当然是可变的了。

     

    5.

     NSMutableString * str1 = [NSMutableString stringWithFormat:@"123"];

    NSMutableString * str2 = [NSMutableString stringWithFormat:@"abc"];

    NSArray * a1 = @[str1,str2];

    [a1[0] appendString:@"456"];

    NSArray * a2 = a1;

    [a2[1] appendString:@"def"];

    根据 1 中的描述,a2指向的地址跟a1指向的地址是一样的,那么经过上面的修改之后,str1=123456 str2=abcdef

    6.

    NSMutableString * str1 = [NSMutableString stringWithFormat:@"123"];

    NSMutableString * str2 = [NSMutableString stringWithFormat:@"abc"];

    NSArray * a1 = @[str1,str2];

    [a1[0] appendString:@"456"];

    NSArray * a2 = [a1 copy];

    [a2[1] appendString:@"def"];

    根据2中的描述,a2指向的地址跟a1指向的地址是一样的,所以执行的结果跟5是一样的。

    7.

    NSMutableString * str1 = [NSMutableString stringWithFormat:@"123"];

    NSMutableString * str2 = [NSMutableString stringWithFormat:@"abc"];

    NSArray * a1 = @[str1,str2];

    [a1[0] appendString:@"456"];

    NSArray * a2 = [a1 mutableCopy];

    [a2[1] appendString:@"def"];

    根据的描述a1 跟a2所指向的地址是不一样的,也就是a2是a1的一份拷贝,而在拷贝的时候,只拷贝了一级,所以a2里面的内容同样也指向str1跟str2,那么当通过[a2[1appendString:@"def"];来操作的时候,实际上是对str2进行了操作,所以也会影响到a1的输出。

    ===========================================================================

    8.

    NSMutableArray * a1 = [NSMutableArray arrayWithObjects:@"1",@"2",@"3",nil];

    NSMutableArray * a2 = a1;

    a1[0] = @"111";

    NSLog(@"a1p:%p a2p:%p",a1,a2);

    但是他们指向的地址都是一样的,所以对a1作的操作,也会影响到a2.

     

    9.

       NSMutableArray * a1 = [NSMutableArray arrayWithObjects:@"1",@"2",@"3",nil];

        NSMutableArray * a2 = [a1 copy];

        a1[0] = @"111";

        a2[0] = @"222";

    这里的a1跟a2所指向的地址是不一样的,通过修改a1,是不更改a2的。而通过copy出来的a2,虽然声明的是NSMutableArray类型,但是实际上却是NSArray类型,所以执行a2[0] = @"222";操作在编译的时候不会出现问题,但是在运行的时候是会crash掉的。

    10.

        NSMutableArray * a1 = [NSMutableArray arrayWithObjects:@"1",@"2",@"3",nil];

        NSMutableArray * a2 = [a1 mutableCopy];

        a1[0] = @"111";

        a2[1] = @"222";

    这里的a1跟a2所执行的地址是不相同的,所以a1[0] = @"111";的修改只针对了a1,a2[1] = @"222";的修改只针对a2.

    11.

        NSMutableString * str1 = [NSMutableString stringWithFormat:@"123"];

        NSMutableArray * a1 = [NSMutableArray arrayWithObjects:str1,@"2",@"3",nil];

        NSMutableArray * a2 = [a1 copy];

        [a1[0] appendString:@"456"];

        a1[1] = @"2222";

    执行上面之后,得到的结果是  a1:@"123456",@"2222",@"3"   a2:@"123456",@"2",@"3"

    12.

        NSMutableString * str1 = [NSMutableString stringWithFormat:@"123"];

        NSMutableArray * a1 = [NSMutableArray arrayWithObjects:str1,@"2",@"3",nil];

        NSMutableArray * a2 = [a1 mutableCopy];

        [a1[0] appendString:@"456"];

        a1[1] = @"2222";

    执行上面之后,得到的结果是  a1:@"123456",@"2222",@"3"   a2:@"123456",@"2",@"3"

     

    //////

    总结下,对于“不可变”变量,“=” “copy”操作只是增加了持有者的数量,"mutableCopy"会重新拷贝出一分。

    对于“可变”变量,"="增加持有者数量,"copy"拷贝出一份“不可变”(不能修改)变量,“mutableCopy”拷贝出一份可变变量。

    这里的所有的“拷贝”指的都是浅拷贝 ,例子11中,执行a2 = [a1 copy];之后,a2的数据应该是"p->str1","2","3"   应为a1[0]指向的是str1,而a2的第一个元素的值也是指向str1,所以通过a1修改第一个元素,也影响到了a2.

  • 相关阅读:
    bugKu getshell
    XCTF 进阶区 CAT
    php弱类型比较
    XCTF command_execution
    关于错误 openssl/ssl.h:没有那个文件或目录的解决办法
    libffi-dev : 依赖: libffi6 (= 3.2.1-4) 但是 3.2.1-4kord 正要被安装
    如何查看 Ubuntu下已安装包版本号
    git 下载指定tag版本的源码
    ubuntu 环境 openstack 源码包制成 deb 包
    fedora 国内源
  • 原文地址:https://www.cnblogs.com/rollrock/p/4798137.html
Copyright © 2011-2022 走看看