zoukankan      html  css  js  c++  java
  • 【转】 NSArray copy 问题

     
      好久没写博客了,今天看到同事的代码中用到了 copy 这个 方法,之前也有了解过,但是不是很深入,概念都比较模糊,虽然已经搞了一年的 iOS 开发,但是 还是 不太了解 真是惭愧,于是乎自己就写了点儿东西来测试,我知道iOS中都是指针 也就是说 如果 有一个 array ,然后申明一个 array1 = [array copy];那么array1和array是指向同一片内存的,所以 当你改变array1 的内容,那么array 也就自然跟着变化了,于是乎便有了以下代码和出现的问题:

    1 NSMutableArray *array = [NSMutableArray arrayWithObjects:@"111",@"222",@"333",nil];
    2 NSMutableArray *array1 = [array copy];
    3 NSMutableArray *array2 = array1;
    4 NSLog(@"aray:%@,array1:%@,array2:%@",array,array1,array2);
    5 [aray1 removeObjectAtIndex:1];
    6 NSLog(@"aray:%@,array1:%@,array2:%@",array,array1,array2);
    按照我们的思路,那么第一次打印出应该全都是 111,222,333,没错,对的
    那么第二次打印出什么呢?同样 我们也想着应该是 array 111,222,333, 而 array1 和 array2 打印应该是 111,333,对吗?答案是 错的,为什么呢,因为程序运行到 [aray1 removeObjectAtIndex:1];就报错了,那么报什么错呢,为什么会报错呢?
     

    -[__NSArrayI removeObjectAtIndex:]: unrecognized selector sent to instance  这个就是错误,

    按照我们的经验,这种错误大概也就array没有这个方法 或者 不能响应这个 方法,怎么可能,明明是 NSMutableArray类型的 怎么可能没有或者不能响应removeObjectAtIdex方法呢,

    后来我想了好久,可能是 copy 的问题,于是我把 NSMutableArray *array1 = [array copy]; 换成 NSMutableArray *array1 = [NSMutableArray arrayWithArray:array];

    这样就不会报错了,问题解决了,

     

    后来我想,虽然问题解决了,但是 这个问题究竟是出在什么地方,为什么会这样呢,想了好久 我大概在猜测,可能是 虽然 array1 我们申明了 NSMutableArray 但是 有可能 copy 后 就成了 NSArray了 之前我有遇到过类似的问题,于是 我就上网查资料 仔细看看 copy 究竟是怎么一回事儿,后来终于明白了,copy是浅拷贝,虽然申明的是NSMutableArray 但是 经过copy 之后的数组还是不可变的,如果要让他可变那么把 [array copy];改成[array mutableCopy];就可以了,果然我一改 问题立刻就解决了,结果和我们预期一样,

     

    通过这个问题,总结如下:copy 是浅拷贝虽然申明为 NSMutable的变量,结果还是不可变的,如果要让copy之后的变量可变,那么用 mutableCopy 。

     

    虽然开发了一年iOS 但是 基础的东西都还不是太明白,真是 惭愧,还有,如果用 NSString来验证指针指向的问题,似乎不行,因为 NSString *string = @"123";这个方法和 NSString *string = [[NSString alloc] initWithString:@"123"];似乎是等价的(这个是我自己猜测的,我之前用过string来验证,谁让string这么简单方便呢,大 家开始都会很自然的想到用string,我也不例外啦),每次都会new出一片内存,这样就达不到我们想要的效果了,所以如果要用 NSString 来验证的话,string初始化最好用 [[NSString alloc] initWithString:@"123"];这样应该可以。

  • 相关阅读:
    mysql decimal(10,2)对应java类型
    idea maven 配置spring boot dev-tools热部署
    在CentOS 8上安装Java 11(OpenJDK 11)和Java 8(OpenJDK 8)的方法
    关于mybatis-plus中Service和Mapper的分析
    Springboot测试类之@RunWith注解
    Get bit field from buffer as an integer / Set bit field in buffer from an integer
    A generic doubly linked list implementation
    Array helper
    Base64 Encoding/Decoding
    ffmpeg color_table[]
  • 原文地址:https://www.cnblogs.com/A--G/p/4619583.html
Copyright © 2011-2022 走看看