黑马程序员 oc弱语法,类方法,self,重写方法,super
-----------黑马程序员 IOS培训、Android培训、Java培训、期待与您交流----------------
#import <Foundation/Foundation.h>
@interface Person : NSObject
+ (void)test1;
- (void)test1;
+ (void)test2;
- (void)test2;
@end
@implementation Person
// 当实现test方法,源程序编译的时候,不会出现报错,也不会警告,运行时也不会有问题,如果把@interface去掉,@implementation写成@implementation Person :NSObject,就可以完全省略@interface了,这也是oc弱语法的体现
- (void)test
{
NSLog(@"我爱oc语言!");
}
+ (void)test1
{
NSLog(@"我要测试类方法!");
}
- (void)test1
{
NSLog(@"我要测试对象方法!");
}
+ (void)test2
{
// self:指向方法调用者,也就是谁调用这个方法它就指向谁
[self test1];
NSLog(@"听说+黑马程序员很厉害!");
}
- (void)test2
{
// self:指向方法调用者,也就是谁调用这个方法它就指向谁
[self test1];
NSLog(@"听说-黑马程序员很强大!");
}
@end
@interface Student : Person
@end
@implementation Student
// 重写方法,将覆盖父类方法
+ (void)test2
{
NSLog(@"我将成为黑马程序员!");
// 当我们想重写父类方法,又想又有父类的一些东西,但又不想重写一遍时,我们可以用super
[super test2];
}
@end
int main()
{
Person *p = [Person new];
/*
oc中对象方法是储存在类中,类方法也是储存在类中,对象调用方法是把对象方法包装成SEL数据,SEL数据通过isa指针在类中寻找到相同的SEL数据并获取与之相对应的方法地址,通过方法地址调用方法返回给对象,告知对象这个行为怎么做。而类方法可以直接从本身类中寻找,这样效率更高。由此可知相对于调用类方法,对象方法更耗性能,效率更低,而调用类方法有个前提就是类方法内不涉及成员变量,当满足这个条件的时候,尽量用类方法。
*/
// 类方法
[Person test1];
//对象方法
[p test1];
/*
当test方法没有在类中声明,源程序编译的时候,只会发出警告,连接的时候,完全没有问题,只有在运行的时候才会报错:- [Person test]:unrecognized selector sent to instance,这是oc语言动态检测方法也就是只有在运行时才会检测你的方法有没有实现,这相当不利于编程的,也是oc弱语法的体现
*/
[p test];
// 从结果中可以知道self指向p,并调用对象方法test1
[p test2];
// 从结果中可以知道self指向Person类,并掉用类方法test1,我们可以看self所在的方法,这个方法是-还是+,如果是-,那么这个self指向对象,如果是+那么这个self指向类
[Person test2];
// 调用test2类方法我们可以从结果知道,不仅显示了子类的内容,也显示了父类的内容
[Student test2];
return 0;
}