黑马程序员技术交流社区

标题: OC的2种方法 [打印本页]

作者: xgjyjy    时间: 2016-3-17 12:26
标题: OC的2种方法
1. OC中的方法分两种.

    -> 对象方法/实例方法:  我们之前学习到的方法就叫做对象方法.
                        对象方法必须使用对象名来调用.
                        也就是说,想要去调用对象方法 就必须要创建1个对象.

    -> 类方法:  类方法的调用不依赖于对象,而是依赖于类.
               要调用类方法 不需要创建对象 而是直接通过类名就可以调用.


2. 声明

    1). 对象方法的声明使用一个 - 号

        - (void)sayHi;

    2). 类方法的声明使用一个 + 号.

        + (void)classMethod;


3. 调用

    1). 要调用对象方法就必须要创建1个对象,通过对象名来调用.
        
        [对象名 对象方法名];

    2). 要调用类方法,不需要创建对象. 直接使用类名可以调用.

        [类名 类方法名];

        需要注意的是. 对象方法只能通过对象名来调用.
                    类方法只能通过类名来调用.


3. 类方法的特点:

    1). 节约空间: 因为类方法的调用不需要创建对象.
                 而对象方法的调用还要首先创建1个对象.

    2). 提高效率: 类方法的调用.直接找到代码区中的类,找到类中的类方法执行.
                 对象方法要先通过指针找到对象,再通过对象的isa指针找到类.再找到类中的方法执行.


4. 类方法的局限性
   
    在类方法中无法直接访问类的属性.
    也不能通过self关键字去调用当前类的对象方法.

    因为类方法的调用不需要创建对象的. 而属性只有对象创建了以后才有.
    所以,类方法在执行的时候,对象有可能还没有呢.对象都没有 如何访问属性呢?

    同样的原理;在类方法执行的时候,还没有对象,而对象方法的调用必须要依赖于对象来调用.
    所以.在类方法中不能直接使用self调用当前类的.对象方法.


5. 什么时候,我们需要将方法定义为类方法呢?

    如果我们的方法不需要访问属性.也不需要直接调用当前类中的对象方法.
    那么就可以将这个方法定义为类方法,来节约空间提高效率.



6. 注意的几个问题

    1). 对象方法之间是不能重名的.
    2). 类方法之间也是不能重名的.

    3). 类方法和对象方法可以同名.
        如果通过类名来调用,那么调用的就是类方法.
        如果通过对象来调用,那么调用的就是对象方法.


    4). 对象方法只能通过对象来调用.
        类方法只能通过类来调用.

    5). 类方法中虽然不能直接访问属性和调用对象方法
        但是.可以创建1个对象,访问这个对象的属性和对象方法.

    6). 类方法中不能直接调用当前类的对象方法.除非创建1个对象,通过这个创建的对象调用.
        在对象方法中可以直接使用类名来调用类方法.


7. 类方法的规范.

    1). 我们写1个类 就要为这个类提供1个和类名同名的类方法.这个类方法来返回1个纯洁的对象.
        纯洁的对象: 对象的属性的值都是默认值.

        这个时候,如果想要得到这个类的对象,也可以直接调用这个同名的类方法来创建1个对象.
        
         + (HMPerson *)person
         {
            HMPerson *p1 = [HMPerson new];
            return p1;
         }

         

    2). 如果希望创建出来的对象的属性的值是由创建者指定的.
        那么这个时候,就可以为这个类方法带参数. 在方法内部创建对象. 并初始化对象的属性.
        返回.

         + (HMPerson *)personWithName:(NSString *)name andAge:(int)age
         {
             HMPerson *p1 = [HMPerson new];
             p1->_name = name;
             p1->_age = age;
             return p1;
         }

8. 对象的创建.

    HMPerson *p1 = [HMPerson new];

    new其实是1个类方法.

    做的事情: 创建对象、初始化对象.
    返回值: 返回创建的这个对象的地址.






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2