关于数组内元素是否会被改变的思考
时间:2022-07-24
本文章向大家介绍关于数组内元素是否会被改变的思考,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
起因
项目中双层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;
}
}
}];
}
结论
- 不同的循环语法不影响结果
- 数组是否可变不影响结果
- 想改变数组中模型的地址,必须用系统方法!模型的属性可以被改变
- 想想变量赋值原理和作用域的概念,可能会豁然开朗
测试代码
#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, NSUInteger idx, BOOL * _Nonnull stop) {
for (int i = 0; i < lArr2.count; ++i) {
Person *lP2 = lArr2.lastObject;
obj = lP2;
}
}];
Person *lP = lArr1.firstObject;
NSLog(@"%@,%@",lP1,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:%@,%@",lP1,lP2);
NSLog(@"test3 lP.gStr4Name:%@",lP.gStr4Name);
}
- (void)test4{
Person *lP1 = [[Person alloc] init];
lP1.gStr4Name = @"1号";
NSLog(@"1 P1:%@",lP1);
Person *lP2 = [[Person alloc] init];
lP2.gStr4Name = @"2号";
NSLog(@"1 P2:%@",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;
lP1 = lP2;
NSLog(@"2 P2:%@",lP2);
}
NSLog(@"3 P1:%@",lP1);
}
Person *lP = lArr1.firstObject;
NSLog(@"4:%@,%@",lP1,lP2);
NSLog(@"test3 lP.gStr4Name:%@",lP.gStr4Name);
}
- (void)test5{
Person *lP1 = [[Person alloc] init];
lP1.gStr4Name = @"1号";
NSLog(@"1 P1:%@",lP1);
Person *lP2 = [[Person alloc] init];
lP2.gStr4Name = @"2号";
NSLog(@"1 P2:%@",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:%@",lP1);
}
Person *lP = lArr1.firstObject;
NSLog(@"4:%@,%@",lP1,lP2);
NSLog(@"test3 lP.gStr4Name:%@",lP.gStr4Name);
}
@end
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Laravel 6.2 中添加了可调用容器对象的方法
- php实现微信企业转账功能
- 在 Laravel 6 中缓存数据库查询结果的方法
- PHP操作XML中XPath的应用示例
- Laravel手动返回错误码示例
- laravel添加前台跳转成功页面示例
- PHP设计模式之装饰器(装饰者)模式(Decorator)入门与应用详解
- thinkPHP利用ajax异步上传图片并显示、删除的示例
- Yii框架where查询用法实例分析
- PHP命名空间(namespace)原理与用法详解
- Laravel 在views中加载公共页面的实现代码
- php无限极分类实现方法分析
- PHP从尾到头打印链表实例讲解
- PHP设计模式之外观模式(Facade)入门与应用详解
- PHP实现简单用户登录界面