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不保持对象的链接吗?
答案 0 :(得分:2)
怎么回事?
test
和array[0]
是指向同一对象的不同对象引用:
NSString *test = array[0];
将test
分配给@"2"
时,您将其指向其他对象:
test = @"2";
您不会在array[0]
更改对象引用,直到:
array[0] = @"2";
答案 1 :(得分:1)
定义数组并添加第一个元素时:
NSMutableArray *array = [[NSMutableArray alloc] init];
[array addObject:@"1"];
您的存储空间如下所示:
现在定义一个NSString
变量,就像这样
NSString *test = array[0];
你创建一个指向第一个数组元素的指针 test
。但是,不是第一个数组元素。它只是指向它。
使用
test = @"2";
您让test
指针指向字符串@"2"
。因此,您只需为字符串指针指定一个新值(地址)。
因此,在此行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
中进行了修改。