iOS形參傳遞的是什么?
你是否也有這樣的困惑?當我將一個對象傳給一個函數(shù)后,這個函數(shù)領(lǐng)有值是原始對象,還是一個克隆體?當原始對象產(chǎn)生扭轉(zhuǎn)后,函數(shù)內(nèi)形參的值是否會隨之扭轉(zhuǎn)?
先介紹 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
很顯著:地址雷同
ps;iOS開發(fā)交流技術(shù):歡迎你的加入,不管你是大牛還是小白都歡迎入駐 ,分享BAT,阿里面試題、面試經(jīng)驗,討論技術(shù), 大家一起交流學習成長
為了保險起見,咱們來看看屬性的變動產(chǎn)生的影響,這個可能是咱們真真切切關(guān)系的
-(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ù)的值
用一個辦法扭轉(zhuǎn)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
即:當咱們扭轉(zhuǎn)全局變量_zs外面屬性的值時,say:函數(shù)里的形參p里的屬性值也產(chǎn)生了變換。
Swift的狀況相似
因為 Swift 打印地址比擬麻煩,故只做了屬性變動的測試
示例代碼
Parameter