修改NSMutableArray中的元素时的注意事项

最近做项目遇到从文件加载数组,并对数组中的元素进行操作的问题,特意写了个Demo,记录下要注意的东西:

代码如下:

NSArray *array = @[@"1", @"2", @"3"];
NSMutableArray *marray = [[NSMutableArray alloc] initWithArray:array];
NSString *temp = [marray objectAtIndex:1];
temp = @"22";
NSLog(@"%@", marray);  

[marray removeObjectAtIndex:1];
[marray insertObject:temp atIndex:1];
NSLog(@"%@", marray);  

Run起来看看:

2014-01-22 04:25:52.841 Arraytest[10932:70b] (
    1,
    2,
    3
)
2014-01-22 04:25:52.842 Arraytest[10932:70b] (
    1,
    22,
    3
)  

问题主要在于:

首先从NSMutableArray中的元素中取出索引为i的元素并赋值给temp。

如果直接对temp操作,修改其字符串值,因为令temp = @"22"是生成了一个NSConstantString类对象,temp指针的指向发生了变化,不再指向原来数组中的对象,因此不会对原来的NSMutableArray索引为i的元素造成影响。

如果要将影响保存到数组中,那么要先remove索引为i的元素再insert temp元素进数组中。

时间: 2024-08-02 15:53:55

修改NSMutableArray中的元素时的注意事项的相关文章

android 修改listview中adapter数据时抛出异常java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification问题

近日在做项目时遇到非必现crush,具体异常信息为: // Short Msg: java.lang.IllegalStateException // Long Msg: java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not mo

在构造函数中使用new时的注意事项

果然,光看书是没用的,一编程序,很多问题就出现了-- 注意事项: 1. 如果构造函数中适用了new初始化指针成员,则构析函数中必须要用delete 2. new与delete必须兼容,new对应delete,new[]对应delete[] 3.如果有多个构造函数,则必须以相同的方式使用new,要么都是new,要么都是new[],因为构析函数只能有一个 4. 应该定义一个复制构造函数,通过深度复制,将一个对象初始化为另一个对象 5. 应该定义一个赋值运算符,通过深度复制,将一个对象复制给另一个对象

DLL中使用字符串时的注意事项。

library dll1; uses SysUtils, Classes; {$R *.res} function TESTDLL:string;stdcall; begin Result:='test.'; end; exports TESTDLL; begin end. 原文地址:https://www.cnblogs.com/blogpro/p/11453436.html

angular中使用swiper时的问题

使用angularjs动态循环生成swiper-slide类,在swiper-wrapper里生成6个以上的滑动页,可是就是划不到第二页,尝试将longSwipesRatio的值修改到最小,仍然不起作用. 1 2 3 4 5 6 7 8 <div class="swiper-wrapper" > <!-- =======循环部分======= --> <div class="swiper-slide" ng-repeat="r

当JAVA集合移除自身集合元素时发生的诸多问题

一段代码目的是想删除集合中包含"a"字符串的集合项: public class TestForeach { public static void main(String[] args){ //ArrayList<String> lists = new ArrayList<String>(); Collection<String> lists = new HashSet<String>(); lists.add("abvd&quo

访问Mat矩阵中的元素并为其赋值

在OpenCV中有三种方式访问矩阵中的数据元素:容易的方式,困难的方式,以及正确的方式.今天主要讲容易方式: 最容易的方式是使用宏CV_MAT_ELEM( matrix, elemtype, row, col ),输入参数是矩阵,不是指针,网上有很多人说是指针,矩阵元素类型,行,列,返回值是相应行,列的矩阵元素.CV_MAT_ELEM可以给矩阵赋值,也可以访问矩阵元素. CV_MAT_ELEM宏实际上会调用CV_MAT_ELEM_PTR(matrix,row,col)宏来完成任务. CV_MAT

JavaScript 的in 操作符 (“如何判断某值是否数组中的元素”?)

在编写JavaScript时,遇到一个常见的问题"如何判断某值是否数组中的元素"?这让我想起了PHP中的in_array()函数和Python中in 操作符.但JavaScript似乎没有内置类似的函数,而其in 操作符的作用也有点不同.通过查询相关的资料,我发现JavaScript的in 操作符还是挺有用的. 一.问题让我想到in 操作符,正是因为这样一个问题:"如何判断某值是否数组中的元素"?在PHP中,您可能会这样来处理: $os = array("

java中在for循环中remove元素时的陷阱

java.util.ConcurrentModificationException 如果删空了,会报上面这个异常 输出结果如下:remove前集合数据:a,a,b,a,a, remove后集合数据:a,b,a, 为什么会出现这种情况?原因是集合的大小是动态变化的,在删除第1个值为“a”的元素后,集合的大小已经发生了改变,但是i的值在删除后继续执行了加1操作,此时已经跳过了“a”元素后的元素(即原集合中第2个“a”元素). 如下删除集合中值为“a”的元素时: import java.util.*;

Android中Activity切换时共享视图元素的切换动画(4.x兼容方案)

同时发布在我的博客 点此进入 开始 上一篇讲了使用 Google 的 AppCompat-v7 来实现 Activity 切换时实现共享视图元素的切换动画.这一篇介绍两个可以兼容 4.x 的两个第三方方案. 上一篇:Android中Activity切换时共享视图元素的切换动画(5.0以上) 方案一:PreLollipopTransition 首先在 build.gradle 配置文件添加这个库依赖 dependencies { compile 'com.kogitune:pre-lollipop