声明和实现:
类方法比对象方法优化体现在不用创建对象就能执行行为。 在内存中, + 识别为类方法, 直接去类的存储空间中调用方法。 对象方法则需要通过对象指针访问对象, 通过isa指针访问类空间, 才能调用到方法。
+ 开头的方法 和 - 开头的方法是不同的。 类不能调用对象的方法, 对象不能调用类的方法。 否则(编译链接可以通过)运行时会报错,找不到相应的类/对象方法。
因为类方法和对象方法不同, 所以可以有同名的类方法和对象方法。
+ (void) test;
- (void) test;
注意: 成员变量也叫实例变量, 是只有实例(对象)才有的变量, 类没有成员变量。 在内存中, 对象里有存储空间存放成员变量的值,类的空间里是没有存放成员变量的地方的, 所以类没有成员变量的值, 类方法不能访问成员变量。
类方法的好处: 不依赖于对象, 执行效率高(能用类方法尽量用类方法)。
使用: 当方法内部不需要访问成员变量时, 就可以使用类方法。
下面一个案例为对象跟函数,通过调用函数修改对象的属性值:
- #import <Foundation/Foundation.h>
- @interface Car : NSObject
- {
- @public
- int wheels;
- int speed;
- }
- - (void)run;
- @end
- @implementation Car
- - (void)run
- {
- NSLog(@"轮子个数为%d,车速为%dkm/s",wheels,speed);
- }
- @end
- void test(Car *newC)
- {
- newC->wheels = 4;
- newC->speed = 300;
- }
- int main()
- {
- Car *c = [Car new];
- c->wheels = 5;
- c->speed = 250;
- test(c);
- [c run];
- }
*** 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代表调用该方法的类。