Objective-C 函数

  • 函数

    函数是一起执行任务的一组语句。每个Objective-C程序都有一个C函数,即main(),所有最简单的程序都可以定义其他函数。您可以将代码分成单独的函数。如何在不同功能之间划分代码取决于您,但是从逻辑上来说,划分通常是使每个功能执行特定任务。函数声明告诉编译器函数的名称,返回类型和参数。函数定义提供了函数的实际主体。基本上在Objective-C中,我们将该函数称为方法。Objective-C基础框架提供了程序可以调用的许多内置方法。例如,使用方法appendString()将字符串追加到另一个字符串。已知一种具有各种名称的方法,例如函数,子例程或过程等。
  • 定义方法

    Objective-C编程语言中方法定义的一般形式如下-
    
    - (return_type) method_name:( argumentType1 )argumentName1 
    joiningArgument2:( argumentType2 )argumentName2 ... 
    joiningArgumentn:( argumentTypen )argumentNamen {
       body of the function
    }
    
    Objective-C编程语言中的方法定义由方法名称和方法主体组成。这是方法的所有部分-
    • 返回类型 - 方法可以返回一个值。return_type是值的函数返回的数据类型。一些方法执行所需的操作而不返回值。在这种情况下,return_type是关键字void。
    • 方法名称 - method_name这是方法的实际名称。方法名称和参数列表共同构成方法签名。
    • 参数 - 参数就像一个占位符。调用函数时,将一个值传递给参数。此值称为实际参数或自变量。参数列表是指方法的参数的类型,顺序和数量。参数是可选的;也就是说,一个方法可以不包含任何参数。
    • 联接参数 - 联接参数是为了使其更易于阅读并在调用时使其清晰明了。
    • 方法主体 - 方法主体包含用于定义方法功能的语句的集合。
    示例 - 以下是称为max()的方法的源代码。此方法采用两个参数num1和num2,并返回两个参数之间的最大值-
    
    /* 函数返回两个数字之间的最大值 */
    - (int) max:(int) num1 secondNumber:(int) num2 {
       
       /* 局部变量声明 */
       int result;
     
       if (num1 > num2) {
          result = num1;
       } else {
          result = num2;
       }
     
       return result; 
    }
    
  • 方法声明

    方法声明告诉编译器函数名称以及如何调用方法。函数的实际主体可以单独定义。方法声明包含以下部分-
    
    - (return_type) function_name:( argumentType1 )argumentName1 
    joiningArgument2:( argumentType2 )argumentName2 ... 
    joiningArgumentn:( argumentTypen )argumentNamen;
    
    对于上面定义的函数max(),以下是方法声明-
    
    -(int) max:(int)num1 andNum2:(int)num2;
    
    在一个源文件中定义一个方法并在另一个文件中调用该方法时,需要方法声明。在这种情况下,您应该在调用函数的文件顶部声明该函数。
  • 方法调用

    创建Objective-C方法时,您需要定义函数的功能。要使用方法,您将必须调用该函数来执行定义的任务。当程序调用函数时,程序控制将转移到被调用的方法。被调用的方法执行已定义的任务,并在执行其return语句或达到其函数结束的右括号时,将程序控制权返回给主程序。要调用方法,您只需要传递所需的参数以及方法名称,如果方法返回值,则可以存储返回的值。例如
    
    #import <Foundation/Foundation.h>
    
    @interface SampleClass:NSObject
    /* 方法声明 */
    - (int)max:(int)num1 andNum2:(int)num2;
    @end
    
    @implementation SampleClass
    
    /*返回两个数字之间最大值的方法 */
    - (int)max:(int)num1 andNum2:(int)num2 {
    
       /* local variable declaration */
       int result;
     
       if (num1 > num2) {
          result = num1;
       } else {
          result = num2;
       }
     
       return result; 
    }
    
    @end
    
    int main () {
       
       /* 局部变量定义 */
       int a = 100;
       int b = 200;
       int ret;
       
       SampleClass *sampleClass = [[SampleClass alloc]init];
    
       /* 调用方法以获取最大值 */
       ret = [sampleClass max:a andNum2:b];
     
       NSLog(@"Max value is : %d\n", ret );
       return 0;
    }
    
    -
    
    2020-08-12 22:28:45.912 test[26080] Max value is : 200
    
  • 函数参数

    如果函数要使用参数,则它必须声明接受参数值的变量。这些变量称为函数的形式参数。形式参数的行为类似于函数内部的其他局部变量,并且在进入函数时创建并在退出时销毁。调用函数时,有两种方法可以将参数传递给函数-
    • 按值调用 - 此方法将参数的实际值复制到函数的形式参数中。在这种情况下,对函数内部参数的更改不会对参数产生影响。
    • 按引用调用 - 此方法将参数的地址复制到形式参数中。在函数内部,该地址用于访问调用中使用的实际参数。这意味着对参数所做的更改会影响参数。
    默认情况下,Objective-C使用按值调用来传递参数。通常,这意味着函数中的代码不能更改用于调用该函数的参数,并且上述示例在调用max()函数时使用了该方法。
    按值调用
    
    #import <Foundation/Foundation.h>
    
    @interface SampleClass:NSObject
    /* 方法声明 */
    - (void)swap:(int)num1 andNum2:(int)num2;
    @end
    
    @implementation SampleClass
    
    - (void)swap:(int)num1 andNum2:(int)num2 {
       int temp;
    
       temp = num1;   /* save the value of num1 */
       num1 = num2;   /* put num2 into num1 */
       num2 = temp;   /* put temp into num2 */
       
    }
    
    @end
    
    int main () {
       
       /* 局部变量定义 */
       int a = 100;
       int b = 200;
       
       SampleClass *sampleClass = [[SampleClass alloc]init];
    
       NSLog(@"Before swap, value of a : %d\n", a );
       NSLog(@"Before swap, value of b : %d\n", b );
     
       /* 调用函数交换值 */
       [sampleClass swap:a andNum2:b];
     
       NSLog(@"After swap, value of a : %d\n", a );
       NSLog(@"After swap, value of b : %d\n", b );
     
       return 0;
    }
    
    编译并执行上述代码后,将产生以下结果-
    
    2013-08-10 12:12:42.011 test[13488] Before swap, value of a : 100
    2013-08-10 12:12:42.011 test[13488] Before swap, value of b : 200
    2013-08-10 12:12:42.011 test[13488] After swap, value of a : 100
    2013-08-10 12:12:42.011 test[13488] After swap, value of b : 200
    
    这表明尽管已在函数中更改了值,但这些值没有更改。
    按引用调用
    为了通过引用传递值,参数指针与任何其他值一样传递给函数。因此,因此,您需要像下面的函数swap()将函数参数声明为指针类型,该函数交换其参数所指向的两个整数变量的值。
    有关指针知识,请查阅后面相关章节。
    
    #import <Foundation/Foundation.h>
    
    @interface SampleClass:NSObject
    /* 方法声明 */
    - (void)swap:(int *)num1 andNum2:(int *)num2;
    @end
    
    @implementation SampleClass
    
    - (void)swap:(int *)num1 andNum2:(int *)num2 {
       int temp;
    
       temp = *num1;     /* save the value of num1 */
       *num1 = *num2;    /* put num2 into num1 */
       *num2 = temp;     /* put temp into num2 */
      
       return;
       
    }
    
    @end
    
    int main () {
       
       /* 局部变量定义 */
       int a = 100;
       int b = 200;
       
       SampleClass *sampleClass = [[SampleClass alloc]init];
    
       NSLog(@"Before swap, value of a : %d\n", a );
       NSLog(@"Before swap, value of b : %d\n", b );
     
       /* 调用函数以交换值 */
       [sampleClass swap:&a andNum2:&b];
     
       NSLog(@"After swap, value of a : %d\n", a );
       NSLog(@"After swap, value of b : %d\n", b );
     
       return 0;
    }
    
    编译并执行上述代码后,将产生以下结果-
    
    2013-08-16 12:27:17.716 test[6721] Before swap, value of a : 100
    2013-08-16 12:27:17.716 test[6721] Before swap, value of b : 200
    2013-08-16 12:27:17.716 test[6721] After swap, value of a : 200
    2013-08-16 12:27:17.716 test[6721] After swap, value of b : 100
    
    这表明更改已反映在函数外部,不同于按值调用。