项目中双层for循环时,想当然的认为内部局部指针变量的变化会影响外面数组中模型的地址。结果调试后发现,是不对的。
- (voID)pmy_updateCachedArr:(NSArray<HTBNWaitBusesM4Cal *> *)cachedArr withNewInfoArr:(NSArray<HTBNWaitBusesM4Cal *> *)newInfoArr{ [newInfoArr enumerateObjectsUsingBlock:^(HTBNWaitBusesM4Cal * _Nonnull obj,NSUInteger IDx,BOol * _Nonnull stop) { for (int i = 0; i < cachedArr.count; ++i) { HTBNWaitBusesM4Cal *lM = cachedArr[i]; if ([lM isEqual:obj]) { //不能这么做,lM地址会变,但是无法影响for循环外面数组中元素的地址!!!思考作用域原理即可理解。// lM = obj;//外面数组中元素的属性是可以被改变的 lM.gNearestStaM = obj.gNearestStaM; } } }];}
结论@H_403_1@不同的循环语法不影响结果数组是否可变不影响结果想改变数组中模型的地址,必须用系统方法!模型的属性可以被改变想想变量赋值原理和作用域的概念,可能会豁然开朗测试代码@H_403_1@#import "VIEwController.h"#import "Person.h"@interface VIEwController ()@end@implementation VIEwController- (voID)vIEwDIDLoad { [super vIEwDIDLoad]; [self test1]; [self test2]; [self test3]; //[self test4]; //[self test5];}- (voID)test1{ Person *lP1 = [[Person alloc] init]; lP1.gStr4name = @"1号"; Person *lP2 = [[Person alloc] init]; lP2.gStr4name = @"2号"; lP1 = lP2; NSLog(@"%@,%@",lP1,lP2); NSLog(@"test1 lP1.gStr4name:%@",lP1.gStr4name);}- (voID)test2{ Person *lP1 = [[Person alloc] init]; lP1.gStr4name = @"1号"; Person *lP2 = [[Person alloc] init]; lP2.gStr4name = @"2号"; NSArray *lArr1 = @[lP1]; NSArray *lArr2 = @[lP2]; [lArr1 enumerateObjectsUsingBlock:^(Person * _Nonnull obj,BOol * _Nonnull stop) { for (int i = 0; i < lArr2.count; ++i) { Person *lP2 = lArr2.lastObject; obj = lP2; } }]; Person *lP = lArr1.firstObject; NSLog(@"%@,lP2); //原以为会打印 2号,想想变量赋值原理和作用域的概念,豁然开朗 NSLog(@"test2 lP.gStr4name:%@",lP.gStr4name);}- (voID)test3{ Person *lP1 = [[Person alloc] init]; lP1.gStr4name = @"1号"; NSLog(@"1 P1:%@",lP1); Person *lP2 = [[Person alloc] init]; lP2.gStr4name = @"2号"; NSLog(@"1 P2:%@",lP2); NSArray *lArr1 = @[lP1]; NSArray *lArr2 = @[lP2]; //不同的循环语法不影响结果 for (int i = 0; i < lArr1.count; ++i) { Person *lP1 = lArr1.firstObject; NSLog(@"2 P1:%@",lP1); for (int j = 0; j < lArr2.count; ++j) { Person *lP2 = lArr2.lastObject; lP1 = lP2; NSLog(@"2 P2:%@",lP2); } NSLog(@"3 P1:%@",lP1); } Person *lP = lArr1.firstObject; NSLog(@"4:%@,lP2); NSLog(@"test3 lP.gStr4name:%@",lP.gStr4name);}- (voID)test4{ Person *lP1 = [[Person alloc] init]; lP1.gStr4name = @"1号"; NSLog(@"1 P1:%@",lP2); //数组是否可变不影响结果 NSMutableArray *lArr1 = [NSMutableArray arrayWithArray:@[lP1]]; NSMutableArray *lArr2 = [NSMutableArray arrayWithArray:@[lP2]]; for (int i = 0; i < lArr1.count; ++i) { Person *lP1 = lArr1.firstObject; NSLog(@"2 P1:%@",lP.gStr4name);}- (voID)test5{ Person *lP1 = [[Person alloc] init]; lP1.gStr4name = @"1号"; NSLog(@"1 P1:%@",lP2); NSMutableArray *lArr1 = [NSMutableArray arrayWithArray:@[lP1]]; NSMutableArray *lArr2 = [NSMutableArray arrayWithArray:@[lP2]]; for (int i = 0; i < lArr1.count; ++i) { Person *lP1 = lArr1.firstObject; NSLog(@"2 P1:%@",lP1); for (int j = 0; j < lArr2.count; ++j) { Person *lP2 = lArr2.lastObject; //想改变数组内容,必须用系统方法! [lArr1 replaceObjectAtIndex:0 withObject:lP2]; } NSLog(@"3 P1:%@",lP.gStr4name);}@end
总结 以上是内存溢出为你收集整理的关于数组内元素是否会被改变的思考全部内容,希望文章能够帮你解决关于数组内元素是否会被改变的思考所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)