免费开源的iOS开发学习平台

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