美文网首页
iOS函数的参数传递机制

iOS函数的参数传递机制

作者: 封丑儿 | 来源:发表于2018-12-09 17:28 被阅读5次

    站在巨人的肩膀上展望远方!
    感谢:李刚老师的疯狂iOS讲义!!!

    两个概念:

    形参:在声明函数时使用的参数
    实参:在调用函数时传入的参数

    一个本质:

    OC函数的参数传递的本质就是:值传递

    值传递:将实参值的副本(复制品)传入函数内,而实参本质不会收到任何影响。

    举个栗子:

    void swap(int a,int b){
         int temp = a;
         a = b;
         b = temp;
         NSLog(@"swap---%d,%d",a,b);
    }
    int main(int argc, const char * argv[]) {
         @autoreleasepool {
              int a = 1;
              int b = 2;
              swap(a,b);//这里的a,b就是实参
              NSLog(@"swap后---%d,%d",a,b);
         }
         return 0;
    }
    

    运行结果:

    swap---2,1
    swap后---1,2

    原因:

    当系统开始执行函数时,系统为形参执行初始化,就是把实参的值赋给函数的形参,函数里操作的并不是实际的实参值。

    说人话:就是swap中的a,b只是main函数中a,b的复制品!当swap调用a,b时,是将main函数中的a,b的值复制进自己函数中给自己的a,b,所以改变时只会改变自己函数中的a,b。
    来来来,我们把这颗栗子在加工一下:

    @interface Person : NSObject
    @property int a;
    @property int b;
    @end
    
    #import <Foundation/Foundation.h>
    #import "Person.h"
    
    void swap(Person *p){//a,b就是形参
         int temp = p.a;
         p.a = p.b;
         p.b = temp;
         NSLog(@"swap---%d,%d",p.a,p.b);
    }
    
    int main(int argc, const char * argv[]) {
         @autoreleasepool {
              Person *p = [Person new];
              p.a = 1;
              p.b = 2;
              swap(p);//这里的a,b就是实参
              NSLog(@"swap后---%d,%d",p.a,p.b);
         }
         return 0;
    }
    

    运行打印:

    swap---2,1
    swap后---2,1

    哎哎哎,不是值复制吗?为什么swap后p的值也变了呢???
    这里就牵涉到一个概念:指针对象!p是什么?是Person类的实例化变量,它在main函数中储存的是一个指针地址,这个地址指向的是Person对象!而当p作为实参传给swap时,依然是值复制,只不过复制的是p的指针地址!意味着swap中的形参p也是一个指向Person的地址而已,所以再swap操作p,就是直接操作Person本身!!!!
    但是!但是!但是!swap中的p与main函数中的p是两个变量!不信的话你可以在swap中NSLog后添加一个p = nil;看看mian函数中调用swap后p会不会变空。

    相关文章

      网友评论

          本文标题:iOS函数的参数传递机制

          本文链接:https://www.haomeiwen.com/subject/fdrkhqtx.html