Objective-C中两种类型的方法

实例方法或对象方法:在类中以“-”号声明的方法,在此之前的文章中所声明的方法都是实例方法,实例方法的声明请参考之前的文章Objective-C中类的声明与实现

类方法:在类中以“+”号声明,其余与实例方法都一样

类方法的声明

  1. //
  2. // Person.h
  3. // MyObjective-C
  4. //
  5. // Created by ZhaiKun on 2017/10/11.
  6. // Copyright © 2017年 ZhaiKun. All rights reserved.
  7. //
  8. #import <Foundation/Foundation.h>
  9. @interface Person : NSObject
  10. + (void)talk;
  11. @end

类方法的实现

  1. //
  2. // Person.m
  3. // MyObjective-C
  4. //
  5. // Created by ZhaiKun on 2017/10/11.
  6. // Copyright © 2017年 ZhaiKun. All rights reserved.
  7. //
  8. #import "Person.h"
  9. @implementation Person
  10. +(void)talk{
  11. NSLog(@"我是一个类方法");
  12. }
  13. @end

注意:类方法的声明和实现与实例方法的声明和实现唯一的区别就在于“+”号和“-”号,其它地方均一样

类方法的调用

类方法的调用不同于实例方法,直接通过类名调用

  1. //
  2. // main.m
  3. // ClassMethod 类方法的声明与调用
  4. //
  5. // Created by ZhaiKun on 2017/10/11.
  6. // Copyright © 2017年 ZhaiKun. All rights reserved.
  7. //
  8. #import <Foundation/Foundation.h>
  9. #import "Person.h"
  10. int main(int argc, const char * argv[]) {
  11. [Person talk];//直接使用类名调用类方法
  12. return 0;
  13. }

程序运行结果:

  1. 2017-10-11 11:43:03.617613+0800 ClassMethod[1389:47747] 我是一个类方法
  2. Program ended with exit code: 0

类方法的调用过程

我之前的文章Objective-C中类是如何存储在内存中的对实例方法在内存中的存储进行了说明,类方法在内存中的存储方式和实例方法一样,都是在内存的代码段中。在调用类方法时,直接在代码段中调用,省去了类的实例对象的创建,从而节省了内存空间,提高了类方法的调用效率。

此外,在类方法中不能直接访问类的属性和实例方法。因为在类方法被调用时,有可能类的实例没有被创建。可以在类方法中直接创建类的实例,通过创建的实例来访问实例的属性和实例方法。在实例方法中可以直接调用类方法。