A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 微雨独行 高级黑马   /  2014-9-28 09:13  /  2266 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 微雨独行 于 2014-9-28 09:35 编辑

自己总结整理了一下关于OC中类方法和对象方法的区别,难免有所遗漏,现拿出来献丑,请各路大神审阅,如有补充,不胜感激!
1、基本概念
  由对象来调用的方法称为对象方法
  直接可以用类名来执行(调用)的方法(类本身会在内存中占据存储空间,里面包含有类\对象方法的列表)称为类方法
注:不是只有类方法列表存储在类的空间,对象方法列表也存储在类的空间。
很好理解,因为不管是类方法还是对象方法,它们的声明都在@interface @end之间  ;实现都在@implementation @end之间。
2、类方法和对象方法对比
  (1) 对象方法
    1> 以减号 - 开头   
    2> 所有数据类型(返回值、参数)都必须写在小括号()里面,而且只有数据类型可以写在小括号()里面;
     3> 方法名遵循驼峰原则;
    4> 如果没有参数,方法名后面什么都不写,例如 - (void)lookMyPhone;
    5> 一个参数对应一个冒号 : ,冒号 : 也是方法名的一部分;
      例如:- (void)sendMessage: (char *)message withPhoneNumber: (char *)number;
          方法名是  sendMessage:withPhoneNumber:
    6> 减号 - 不是方法名的一部分
    7> 只能让对象调用,没有对象,这个方法根本不可能被执行;
    8> 对象方法可以访问实例变量(成员变量);
    9> 对象方法既可以调用对象方法,也可以调用类方法。
 (3) 类方法
    1> 以加号 + 开头
    2> 所有数据类型(返回值、参数)都必须写在小括号()里面,而且只有数据类型可以写在小括号()里面;
    3> 方法名遵循驼峰原则;
    4> 如果没有参数,方法名后面什么都不写,例如 + (void)lookMyPhone;
    5> 一个参数对应一个冒号:,冒号:也是方法名的一部分;
      例如:+ (void)sendMessage:char *)message withPhoneNumber:(char *)number;
          方法名是  sendMessage:withPhoneNumber:
    6> 加号 + 不是方法名的一部分。
    7> 类方法只能用类名调用,对象不能调用
    8> 类方法不能访问实例变量(成员变量)
    9> 使用场合:当不需要访问成员变量的时候,尽量使用类方法
    10> 类方法可以调用自己的类方法,但不能调用自己,会出现死循环。
    11> 类方法可以作为工具方法。
  (3) 类方法可以和对象方法重名(即方法名完全一样),但是二者却是两个完全不同的方法,用方法前面的+ -号区别。
此处个人感觉需要注意的是:对象 和 对象方法 是不同的概念
     (1)对象方法只能让对象调用;类方法只能让类名调用。
     (2)对象不能调用类方法,但是对象方法可以调用类方法(这一点初学时容易迷糊)
3、使用场合不同
  (1)当方法中需要访问实例变量(成员变量)的时候,一定不能使用类方法,只能使用对象方法;
  (2)当方法中不需要访问实例变量(成员变量)的时候,类方法和对象方法都可以使用,但是尽量使用类方法;因为使用类方法可以节省内存,提高效率。
4、类方法和对象方法之间调用的区别
  (1) 类方法调用自己的类方法      可以
     (2) 类方法调用自己的对象方法     不可以
     (3) 对象方法调用自己的类方法     可以
     (4) 对象方法调用自己的对象方法    可以
注:类方法在调用类方法的时候,不能调用自己,会出现死循环。

4 个回复

倒序浏览
有点迷糊,既然备注里说了类方法在调用类方法的时候,不能调用自己,会出现死循环。为什么第一个还是可以
回复 使用道具 举报
本帖最后由 微雨独行 于 2014-9-30 23:08 编辑
SailY 发表于 2014-9-30 22:31
有点迷糊,既然备注里说了类方法在调用类方法的时候,不能调用自己,会出现死循环。为什么第一个还是可以 ...
+ (void)test1{
     NSLog(@"类方法1");
}
+ (void)test2
{
        [Person test];
}
类方法能调用自己的类方法,这里的自己指的是类本身。比如说上面的test1   test2 都是声明实现在Person类中,它的意思是说Person类的类方法可以调用Person类自己的类方法。test1 test2 可以互相调用,但是test1 不能调用 test1, test2 不能调用test2  会出现死循环

回复 使用道具 举报
微雨独行 发表于 2014-9-30 23:00
+ (void)test1{
     NSLog(@"类方法1");
}

哦,原来是这个意思,类方法可以调用自己类的其他类方法,视频貌似讲过一个self死循环的例子
回复 使用道具 举报
SailY 发表于 2014-9-30 23:21
哦,原来是这个意思,类方法可以调用自己类的其他类方法,视频貌似讲过一个self死循环的例子 ...

self 在类方法中使用,代表的就是 类名。 上面那个例子 [Person test]  可以写成 [self test] 这个self代表的就是Person
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马