OC方法Method:2-方法的调用
在Objective-C中,调用一个方法相当于传递一个消息,这里的消息指的是方法名和参数。所有消息的分派都是动态的,所谓动态指的是所有消息处理直到执行时(runtime)才会动态决定,而不是在编译时就绑定,这也体现了Objective-C对象的多态行为(多态性是指不同类型的对象响应同一消息的能力)。
1、方法调用的方式
在Objective-C中,调用一个方法相当于传递一个消息,消息中包含方法名(也称为选择器)和参数。通常调用方法存在如下几种方式。
- 普通调用:使用方括号[]将消息本身与参数放到括号内,同时将接收消息的对象放在最前面。如下所示:
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSString *str = [NSString stringWithFormat:@"九九学院"]; //类方法调用
NSString *str2 = [NSString stringWithFormat:@"www.99ios.com"]; //类方法调用
str = [str stringByAppendingString:str2]; //实例方法调用
NSLog(@"%@",str);
}
return 0;
}
运行结果:
- 嵌套调用:有时为了避免声明大量的局部变量来存储临时结果,Objective-C也支持嵌套消息表达式。上面的案例中,我们可以不声明str2,可以对代码做如下改写:
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSString *str = [NSString stringWithFormat:@"九九学院"]; //类方法调用
str = [str stringByAppendingString:[NSString stringWithFormat:@"www.99ios.com"]]; //方法的嵌套调用
NSLog(@"%@",str);
}
return 0;
}
调用父类的方法:子类可以直接调用父类的方法。如下所示:MYClass继承自NSObject,因此MYClass的对象myClass可以直接调用NSObject的copy方法。
#import "MYClass.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
MYClass *myClass1 = [[MYClass alloc] init];
//调用父类的copy方法
[myClass1 copy];
}
return 0;
}
2、点语法
Objective-C中还提供专门用于调用存取方法(setter/getter)的点语法。我们可以调用getter/setter方法来获取/设置对象属性的值,同样的,可以使用点语法来更加简便的获取/设置对象属性的值。
下面的示例代码中,同时使用点语法对myClass对象的name属性赋值,然后又使用点语法来获取对应的值。
- 创建一个MYClass类,并且添加一个name属性
#import <Foundation/Foundation.h>
@interface MYClass : NSObject
@property (nonatomic, copy) NSString *name;
@end
- 使用点语法对name属性进行赋值以及取值操作
#import <Foundation/Foundation.h>
#import "MYClass.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
//实例化对象
MYClass *myClass = [[MYClass alloc] init];
//使用点语法赋值
myClass.name = @"MYClass";
//使用点语法取值
NSLog(@"class name is %@",myClass.name);
}
return 0;
}
运行结果:
3、消息处理机制
为了深入理解消息、方法、接收者这些概念,就必须要了解消息处理的机制。在Objective-C中,消息是直到运行的时候才和方法进行绑定关联的。
消息机制的关键在于编译器为类和对象生成的结构。其中类的结构中包含两个基本元素:第一,指向父类的指针;第二,类的方法列表。而对象被创建时,对象的第一个实例变量是一个指向该对象的“类结构”的指针,即isa指针。通过该指针,就可以访问到该类及其父类的方法列表。
当向某个对象发送消息时:
- 首先根据isa指针,找到该对象对应的类结构的方法列表,继而即可找到具体的方法实现;当在本类的方法列表中找不到对应的方法时,会根据类结构中父类的指针去查找父类的方法列表,直至NSObject根类;
- 将对象以及参数传递给找到的方法实现;
- 执行方法中的代码,获取方法的返回值。
示例代码
https://github.com/99ios/3.3.2