iOS形参传递的是什么?

你是否也有这样的困惑?当我将一个对象传给一个函数后,这个函数领有值是原始对象,还是一个克隆体?当原始对象产生扭转后,函数内形参的值是否会随之扭转?

先介绍 OC 的状况

咱们晓得打印地址的办法如下:

NSLog(@"地址:%p",p);

那么,让咱们先打印下,传参后的地址变动,此处我对一个Person对象进行了三次援用,别离是:原始值、传参、全局变量,代码如下:

-(void)viewWillAppear:(BOOL)animated{    [super viewWillAppear:animated];    NSLog(@"全局变量地址:%p",_zs);    Person *p = [[Person alloc] init];    p.name = @"张三";    p.address = @"聚贤路";    _zs = p;    NSLog(@"原始地址:%p",p);    NSLog(@"全局变量地址:%p",_zs);    [self say:p];    self.nameTF.text = p.name;    self.addressTF.text = p.address;}-(void)say:(Person *)p{    NSLog(@"形参地址:%p",p);    }

后果如下:

2021-05-25 17:32:21.733520+0800 PerameterDemo_iOS[18143:349387] 全局变量地址:0x02021-05-25 17:32:21.733673+0800 PerameterDemo_iOS[18143:349387] 原始地址:0x600000e2c1202021-05-25 17:32:21.733798+0800 PerameterDemo_iOS[18143:349387] 全局变量地址:0x600000e2c1202021-05-25 17:32:21.733884+0800 PerameterDemo_iOS[18143:349387] 形参地址:0x600000e2c120

很显著:地址雷同

为了保险起见,咱们来看看属性的变动产生的影响,这个可能是咱们真真切切关系的

-(void)viewWillAppear:(BOOL)animated{    [super viewWillAppear:animated];    NSLog(@"全局变量地址:%p",_zs);    Person *p = [[Person alloc] init];    p.name = @"张三";    p.address = @"聚贤路";    _zs = p;    NSLog(@"原始地址:%p",p);    NSLog(@"全局变量地址:%p",_zs);    [self say:p];    self.nameTF.text = p.name;    self.addressTF.text = p.address;}- (IBAction)change:(UIButton *)sender {    _zs.name = self.nameTF.text;    _zs.address = self.addressTF.text;        }-(void)say:(Person *)p{    NSLog(@"形参地址:%p",p);        dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_global_queue(0, 0));    dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC, 0 * NSEC_PER_SEC);    dispatch_source_set_event_handler(timer, ^{        NSLog(@"OC---name:%@    addresss:%@\n",p.name,p.address);    });    dispatch_resume(timer);    _timer = timer;    }

上述代码咱们次要做了两个事件:

  • 开启一个定时器,不停得读传入的参数的值
  • 用一个办法扭转Person对象里属性的值

后果如下:

2021-05-25 17:47:08.290704+0800 PerameterDemo_iOS[18190:358023] OC---name:张三    addresss:聚贤路2021-05-25 17:47:09.290252+0800 PerameterDemo_iOS[18190:358023] OC---name:张三    addresss:聚贤路2021-05-25 17:47:10.290279+0800 PerameterDemo_iOS[18190:358021] OC---name:张三    addresss:聚贤路2021-05-25 17:47:11.291429+0800 PerameterDemo_iOS[18190:358021] OC---name:张三    addresss:聚贤路2021-05-25 17:47:12.291253+0800 PerameterDemo_iOS[18190:358021] OC---name:张三1    addresss:聚贤路12021-05-25 17:47:13.291549+0800 PerameterDemo_iOS[18190:358021] OC---name:张三1    addresss:聚贤路12021-05-25 17:47:14.291376+0800 PerameterDemo_iOS[18190:358021] OC---name:张三1    addresss:聚贤路12021-05-25 17:47:15.291135+0800 PerameterDemo_iOS[18190:358026] OC---name:张三1    addresss:聚贤路1

即:当咱们扭转全局变量_zs外面属性的值时,say:函数里的形参p里的属性值也产生了变换。

Swift的状况相似

因为 Swift 打印地址比拟麻烦,故只做了属性变动的测试

示例代码

Parameter