黑马程序员——OC语言基本语法知识(三)

时间:2023-02-18 20:57:23
*** 类方法 ***

声明和实现:

@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代表调用该方法的类。