关于数组内元素是否会被改变的思考
时间: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
- karma与webpack结合
- Mac说——关闭SIP
- 词典对象 NSDictionary与NSMutableDictionary
- node-inspector调试工具应用
- karma的基础应用之与fis结合
- 区块链学堂——区块链有前途吗?
- 程序猿的日常——Java基础之抽象类与接口、枚举、泛型
- addSubView需要注意的几个点为什么要在addsubview:一个view对象后,release它?
- nodejs 命令行、自定义
- GeForce驱动EULA更新惹争议,NVIDIA的理由是这样的
- 关于HTML面试题汇总之visibility
- 加密狗进场暴富开始?请别侮辱区块链和游戏
- 程序猿的日常——Java基础之clone、序列化、字符串、数组
- [你必须知道的.NET] 第四回:后来居上:class和struct
- 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 数组属性和方法
- 手把手教你 javap 反编译分解代码,授人以鱼不如授人以渔
- LoRa终端设备ASR6505之段式LCD
- redis源码之list结构的实现
- redis源码之dict
- LoRa终端设备ASR6505之ADC采样
- LoRa终端设备ASR6505驱动DHT11
- Mysql系列第七讲 玩转select条件查询,避免采坑
- Mysql第六讲 select查询基础篇
- Mybatis系列第四讲 Mybatis使用详解(2)
- 大型项目技术栈第八讲 Redis
- 大型项目技术栈第七讲 Chosen的使用
- 大型项目技术栈第六讲 EasyExcel的使用
- JavaWeb第二讲 重定向与转发 & doGet()与doPost()
- JavaWeb第一讲 Servlet的工作原理及生命周期
- 多系列数据核密度图