前面大概总结过类方法与对象方法,但是说的不详细,也没有那具体的代码来记录问题,这里再具体对比一下类方法与对象方法,也把self跟super关键字的不同做一下对比。
1.类方法与对象方法
先说一下类方法与对象方法的相同点:
都是声明在类里面的方法,在内存中都是在类的存储空间里面。
不同点:类方法都是以+开头,只能由类来调用(类存储空间里面只有方法,对象存储空间里面才有成员变量),而且不能访问成员变量 调用类方法可以不用创建对象,
对象方法都是以 - 号开头,只能由对象来调用,对象方法中能访问当前对象的成员变量
使用类方法有什么好处呢?类方法的好处就是不依赖于对象,因为调用类方法可以不用创建对象,所以执行效率高。当方法内部不需要使用到成员变量时就改为类方法,类方法可以与对象方法同名。下面一段代码对比一下两者的区别:
#import<Foundation/Foundation.h>
@interface Person:NSObject
+ (void)printClassName; // 声明了三个方法,一个类方法,两个对象方法
- (void)printClassName;
- (void)test;
@end
@implementation Person
+ (void)printClassName
{
NSLog(@"调用类方法");
}
- (void)printClassName
{
NSLog(@"调用对象方法");
}
- (void)test
{
NSLog(@"调用test方法");
[Person printClassName]; // 对象方法test里面又再调用了类方法printClassName
}
@end
int main()
{
Person *p = [Person new];
[p printClassName]; // 此处调用了对象方法printClassName,输出“调用对象方法”
[Person printClassName]; //此处调用了类方法printClassName,输出“调用类方法”,而且没有创建对象哦
[p test]; // 此处调用了对象方法test,输出的内容为“调用test方法,调用类方法”
return 0;
}
此段代码中如果写[Person test]编译的时候会警告,链接的时候会报错:找不到test类方法。
2.关键字self与super
self是指针变量,指向了方法调用者:谁调用这个方法,self就指向谁。self主要有两个作用:
1.在对象方法中利用“self->成员变量”访问当前对象内部的成员变量
2.利用[self 方法名]可以调用其他对象方法或者类方法:self出现在对象方法中,self就代表对象,self出现在类方法中,self就代表类
#import <Foundaton/Foundation.h>
@interface Student:NSObject
{
int _score;
}
- (void)setScore:(int)score; // 封装 setter
- (int)score; // getter
- (void)test;
+ (void)test;
- (void)test1;
+ (void)test1;
@end
@implementation Student
- (void)setScore:(int)score
{
_score = score;
}
- (int)score
{
return _score;
}
- (void)test
{
int _score = 20;
NSLog(@"test分数为%d",self->_score); // self的第一个作用,访问当前对象内部的成员变量
}
+ (void)test
{
NSLog(@"调用类test方法");
}
- (void)test1
{
[self test]; // self的第二个作用,调用其他对象方法,此处调用test对象方法
}
+ (void)test1
{
[self test]; // self的第二个作用,调用其他类方法,此处调用test类方法
}
@end
int main()
{
Student *s = [Student new];
[s setScore:70];
int s = [s score];
NSLog(@"分数为%d",s); // 此处输出结果为“分数为70”
[s test]; // 此处输出结果为“test分数为70” 不要受int _score = 20 ;的影响,self->_score指向的是当前对象的成员变量,而不是一般int 变量
[Student test];
[Student test1]; //此处输出结果为“调用类test方法”
[s test1]; // 此处输出结果为“test分数为70”
return 0;
}
类方法跟对象方法里面都不可以使用self去调用彼此的方法,只能调用同类的方法
super关键字的作用:1.直接调用父类中的某一个方法(所以super是在继承的条件下使用的)
2.super处在对象方法中,则调用父类的对象方法
super处在类方法中,则调用父类的类方法
super关键字的使用场合:子类重写父类的方法时想保留父类的一些行为
#import<Foundation/Foundation.h>
@interface Animal:NSObject
- (void)walk;
- (void)run;
+ (void)run;
@end
@implementation Animal
- (void)walk
{
NSLog(@"动物在走");
}
- (void)run
{
NSLog(@"-动物在跑");
}
+ (void)run
{
NSLog(@"+动物在跑");
}
@end
@interface Dog:Animal
@end
@implementation Dog
- (void)walk
{
NSLog(@"狗在走");
[super walk]; // 此处子类要重写父类的walk方法,同时调用父类的walk对象方法
}
+ (void)run
{
NSLog(@"狗在跑");
[super run]; // 此处也是子类要重写父类的run方法,同时调用父类的run类方法
}
@end
int main()
{
Dog *d = [Dog new];
[d walk]; // 此处输出结果为“狗在走,动物在走”
[Dog run]; // 此处输出结果为“狗在跑,+动物在跑”
return 0;
}
同样地,类方法跟对象方法里面都不可以使用super去调用父类的彼此的方法,只能调用父类的同类的方法