zoukankan      html  css  js  c++  java
  • 黑马程序员——OC语言基本语法知识(三)

    *** 类方法 ***

    声明和实现:

    @interface Person : NSObject
    + (void) age;  //声明一个类方法
    @end
     
    @implementation Person
    + (void) age   //类方法的实现
    {
    NSLog(@"abcd");
    }
    @end
     
    int main()
    {
    [Person age];  //通过类名调用类方法
    return 0;
    }
     

    类方法比对象方法优化体现在不用创建对象就能执行行为。 在内存中, + 识别为类方法, 直接去类的存储空间中调用方法。 对象方法则需要通过对象指针访问对象, 通过isa指针访问类空间, 才能调用到方法。

    开头的方法 和 - 开头的方法是不同的。 类不能调用对象的方法, 对象不能调用类的方法。 否则(编译链接可以通过)运行时会报错,找不到相应的类/对象方法

    因为类方法和对象方法不同, 所以可以有同名的类方法和对象方法。

    + (void) test;

    - (void) test;

    注意: 成员变量也叫实例变量, 是只有实例(对象)才有的变量, 类没有成员变量。 在内存中, 对象里有存储空间存放成员变量的值,类的空间里是没有存放成员变量的地方的, 所以类没有成员变量的值, 类方法不能访问成员变量。

     

    类方法的好处: 不依赖于对象, 执行效率高(能用类方法尽量用类方法)。

    使用: 当方法内部不需要访问成员变量时, 就可以使用类方法。

    下面一个案例为对象跟函数,通过调用函数修改对象的属性值:

     
    1. #import <Foundation/Foundation.h>  
    2.   
    3.   
    4. @interface Car : NSObject  
    5. {  
    6.     @public  
    7.     int wheels;  
    8.     int  speed;  
    9. }  
    10.   
    11. - (void)run;  
    12. @end  
    13.   
    14.   
    15. @implementation Car  
    16.   
    17. - (void)run  
    18. {  
    19.     NSLog(@"轮子个数为%d,车速为%dkm/s",wheels,speed);  
    20. }  
    21. @end  
    22.   
    23.   
    24.   
    25.   
    26. void test(Car *newC)  
    27. {  
    28.     newC->wheels = 4;  
    29.     newC->speed = 300;  
    30. }  
    31.   
    32. int main()  
    33. {  
    34.     Car *c = [Car new];  
    35.     c->wheels = 5;  
    36.     c->speed = 250;  
    37.     test(c);  
    38.       
    39.     [c run];  
    40.       
    41. }  


     

    *** self ***

    self是个指针, 指向调用它的变量 (可能是类, 也可能是对象)。

     

    self用在方法当中代表方法调用者, 谁调用这个方法, self就代表谁。可以使用self来调用其它类方法或者对象方法。

    如果在对象方法里调用该对象的其它方法, 可以使用self来调用:

    - (void) bark 

    {

            NSLog(@"Woof!");

    }

    - (void) barkAndYell 

    {

            [self bark];      // 使用self其它对象方法

            NSLog(@"Wooooooool");

    }

    象方法中的self代表方法的对象, 所以只能调用其它对象方法, 不能调用类方法。

    假设已经写了一个求和方法, 在求平均值方法中可以调用求和方法:

    + (int) averageOfNum1:(int)num1 andNum2:(int)num2 

    {

            int sum = [self sumOfNum1:num1 andNum2:num2];    // 使用self用其它方法

            return sum/2;

    }

    方法中的self只能其它类方法, 不能调用对象方法, 因为self代表调用该方法的类。

  • 相关阅读:
    hdu 4525(数学)
    hdu 4524(模拟)
    hdu 4523(大整数)
    hdu 4517(递推枚举统计)
    hdu 4520
    hdu 4519(数学题)
    hdu 4514(树的直径+并查集)
    hdu 4510(模拟)
    hdu 2089(数位DP)
    hdu 4506(数学,循环节+快速幂)
  • 原文地址:https://www.cnblogs.com/HtercelH/p/4033747.html
Copyright © 2011-2022 走看看