黑马程序员 分类,类的本质,类加载与初始化,description
-----------黑马程序员 IOS培训、Android培训、Java培训、期待与您交流----------------
/*
有时候我们写好一个类之后,想给这个类增加些方法,但又不想改变原来的类,我们可以选择通过分类的方法,在不改变原来类的前提下,增加一些方法
*/
#import <Foundation/Foundation.h>
@interface Person : NSObject
{
int _age;
}
- (void)run;
@end
@implementation Person
- (void)run
{
NSLog(@"赶紧跑路!");
}
// 当程序启动时,系统自动加载一次所有的类,加载完成后会调用load方法
+ (void)load
{
NSLog(@"加载load方法!");
}
// 当第一次使用类的时候,系统会自动调用一次initialize,当第一次调用子类的时候,子类和父类都会进行initialize
+ (void)initialize
{
NSLog(@"Person初始化initialize!");
}
// 通过重写description,能使非NSString的对象,输出字符串
- (NSStirng *)description
{
return [NSString stringWithFormat:@"age=%d",_age];
}
@end
// 给原来类增加方法,使用分类
@interface Person (pb)
- (void)playBasketball;
@end
@implementation Person (pb)
- (void)playBasketball
{
NSLog(@"有人在打篮球!");
}
@end
int main()
{
id p = [[Person alloc] init];
// p调用方法的顺序是先从分类中寻找,再从类中找,最后从父类中找,分类-->类-->父类
[p playBasketball];
/*
当使用NSLog和%@输出对象的时候
1.系统会自动调用对象的-description
2.拿到-description的返回值(NSString*)显示在屏幕上
3.当对象不是NSString的时候,默认返回为<类名 内存地址>
*/
NSLog(@"%@",p);
/*
类本身也是个对象,它是class类型的对象,简称类对象
通过class创建class类型的Person类对象
通过Person类对象创建Person类型的对象
*/
// Class本身包含Class *
// 创建一个person类对象
Class c = [p class];
// 打印出类的内存地址
NSLog(@"c = %p",c);
return 0;
}