iOS系列:iOS形參傳遞的是什么

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • cocoapods-hmap-prebuilt 是什么? cocoapods-hmap-prebuilt 是美團平...
    搬運工iOS橙閱讀 929評論 2 9
  • 一、KVC在開發(fā)中,我們可以通過使用 KVC 的方式來對某個對象的屬性進行賦值/取值操作。經(jīng)常會用到以下 API:...
    搬運工iOS橙閱讀 639評論 1 6
  • 表情是什么,我認為表情就是表現(xiàn)出來的情緒。表情可以傳達很多信息。高興了當然就笑了,難過就哭了。兩者是相互影響密不可...
    Persistenc_6aea閱讀 129,511評論 2 7
  • 16宿命:用概率思維提高你的勝算 以前的我是風險厭惡者,不喜歡去冒險,但是人生放棄了冒險,也就放棄了無數(shù)的可能。 ...
    yichen大刀閱讀 7,648評論 0 4

友情鏈接更多精彩內(nèi)容