在Objective-C中,调用一个方法相当于传递一个消息,这里的消息指的是方法名和参数。所有消息的分派都是动态的,所谓动态指的是所有消息处理直到执行时(runtime)才会动态决定,而不是在编译时就绑定,这也体现了Objective-C对象的多态行为(多态性是指不同类型的对象响应同一消息的能力)。
1、方法调用的方式
在Objective-C中,调用一个方法相当于传递一个消息,消息中包含方法名(也称为选择器)和参数。
普通调用:使用方括号[]将消息本身与参数放到括号内,同时将接收消息的对象放在最前面。如下所示:
NSString*str=[NSStringstringWithFormat:@"宏创学院"];//类方法调用
NSString*str2=[NSStringstringWithFormat:@"探索苹果iOS开发最佳实践!"];//类方法调用
str=[str stringByAppendingString:str2];//实例方法调用
NSLog(@"%@",str);
嵌套调用:有时为了避免声明大量的局部变量来存储临时结果,Objective-C也支持嵌套消息表达式。上面的案例中,我们可以不声明str2,可以对代码做如下改写:
NSString*str=[NSStringstringWithFormat:@"宏创学院"];//类方法调用
str=[str stringByAppendingString:[NSStringstringWithFormat:@"探索苹果iOS开发最佳实践!"]];//方法的嵌套调用
NSLog(@"%@",str);
调用父类的方法:子类可以直接调用父类的方法。如下所示:HCClass继承自NSObject,因此HCClass的对象myClass可以直接调用NSObject的copy方法。
HCClass*myClass1=[[HCClassalloc]init];
//调用父类的copy方法
HCClass*myClass2=[myClass1 copy];
2、点语法
Objective-C中还提供专门用于调用【存取方法】的点语法。我们可以调用getter/setter方法来获取/设置实例变量/属性的值,同样的,可以使用点语法来更加简便的获取/设置对象的值。
下面的示例代码中,同时使用点语法对myClass对象的className属性赋值,然后又使用点语法来获取对应的值。
//实例化对象
HCClass*myClass=[[HCClassalloc]init];
//使用点语法赋值
myClass.className=@"HCClass";
//使用点语法取值
NSLog(@"class name is %@",myClass.className);
3、消息处理机制
为了深入理解消息、方法、接收者这些概念,就必须要了解消息处理的机制。在OC中,消息是直到运行的时候才和方法进行绑定关联的。
消息机制的关键在于编译器为类和对象生成的结构。其中类的结构中包含两个基本元素:第一,指向父类的指针;第二,类的方法列表。而对象被创建时,对象的第一个实例变量是一个指向该对象的“类结构”的指针,即isa,通过该指针,就可以访问到该类及其父类的方法列表。
当向某个对象发送消息时:
首先根据isa指针,找到该对象对应的类结构的方法列表,此时即可找到具体的方法实现;当在本类的方法列表中找不到对应的方法时,会类结构中父类的指针去查找父类的方法列表,直至NSObject根类;
将对象以及参数传递给找到的方法实现;
获取方法的返回值。
![](https://img.haomeiwen.com/i2227058/693278b85d82aed6.gif)
网友评论