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
这表明更改已反映在函数外部,不同于按值调用。