iOS形參傳遞的是什么韩肝?
你是否也有這樣的困惑触菜?當我將一個對象傳給一個函數(shù)后,這個函數(shù)擁有值是原始對象哀峻,還是一個克隆體涡相?當原始對象發(fā)生改變后,函數(shù)內形參的值是否會隨之改變剩蟀?
先介紹 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] 全局變量地址:0x0
2021-05-25 17:32:21.733673+0800 PerameterDemo_iOS[18143:349387] 原始地址:0x600000e2c120
2021-05-25 17:32:21.733798+0800 PerameterDemo_iOS[18143:349387] 全局變量地址:0x600000e2c120
2021-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;
}
上述代碼我們主要做了兩個事情:
開啟一個定時器怀薛,不停得讀傳入的參數(shù)的值
用一個方法改變
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:聚賢路1
2021-05-25 17:47:13.291549+0800 PerameterDemo_iOS[18190:358021] OC---name:張三1 addresss:聚賢路1
2021-05-25 17:47:14.291376+0800 PerameterDemo_iOS[18190:358021] OC---name:張三1 addresss:聚賢路1
2021-05-25 17:47:15.291135+0800 PerameterDemo_iOS[18190:358026] OC---name:張三1 addresss:聚賢路1
即:當我們改變全局變量_zs
里面屬性的值時,say:
函數(shù)里的形參p
里的屬性值也發(fā)生了變換涮拗。
Swift的情況類似
由于 Swift 打印地址比較麻煩乾戏,故只做了屬性變化的測試