更改NSMutableArray中的值

时间:2016-06-17 14:43:21

标签: ios objective-c

NSMutableArray *array = [[NSMutableArray alloc] init];
[array addObject:@"1"];
NSString *test = array[0];
test = @"2";
NSLog(@"%@", array[0]); //Output is 1

array[0] = @"2";
NSLog(@"%@", array[0]); //Output is 2

怎么回事?为什么在第一种情况下输出为1? NSMutableArrat不保持对象的链接吗?

4 个答案:

答案 0 :(得分:2)

  

怎么回事?

testarray[0]是指向同一对象的不同对象引用:

NSString *test = array[0];

test分配给@"2"时,您将其指向其他对象:

test = @"2";

您不会在array[0]更改对象引用,直到:

array[0] = @"2";

答案 1 :(得分:1)

定义数组并添加第一个元素时:

NSMutableArray *array = [[NSMutableArray alloc] init];
[array addObject:@"1"];

您的存储空间如下所示:

Storage after adding the first element to it

现在定义一个NSString变量,就像这样

NSString *test = array[0];

你创建一个指向第一个数组元素的指针 test。但是,不是第一个数组元素。它只是指向它。

Storage after defining and assigning the test string pointer

使用

test = @"2";

您让test指针指向字符串@"2"。因此,您只需为字符串指针指定一个新值(地址)。

Storage after modifying the test string pointer

因此,在此行test之后不再了解有关数组的任何内容,并且数组元素不会被此行修改。

答案 2 :(得分:0)

是的,但NSString不可变,你不只是改变它的价值:当你这样做时:

test = @"2";

使用新值@"2"

创建新指针

所以从现在开始

array[0]是一个不同的指针,它不是你添加到数组中的指针

你可以试试这个,以便更好地理解:

NSMutableString* test = [[NSMutableString alloc] initWithString:@"1"];
NSMutableArray *array = [[NSMutableArray alloc] init];
[array addObject: test];

NSLog(@"test 1: %@", array[0]); //Output is 1
[test setString:@"2"];
NSLog(@"test 2: %@", array[0]); //Output is 2

答案 3 :(得分:0)

您需要以下代码:

java.lang.UnsatisfiedLinkError:
 dalvik.system.PathClassLoader[DexPathList[[zip file
 "/data/app/mytv.mytv-2/base.apk"],nativeLibraryDirectories=[/data/app/mytv.mytv-2/lib/x86, /data/app/mytv.mytv-2/base.apk!/lib/x86, /vendor/lib, /system/lib]]]
 couldn't find "libnmpsdk.so"

这是因为:

static {
    System.loadLibrary("nmpsdk");
}

创建新对象并将其指向变量NSArray *array = @[[@"1" mutableCopy]]; NSMutableString *test = array[0]; [test setString:@"2"]; NSLog(@"%@", array[0]); //Output is 2 ,但test = @"2" 仍然在旧对象上有指针,你还没有改变它。

我的代码使用相同的对象(在数组中存储)来修改值,因此它也在test中进行了修改。