------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
该内容是记录学习中的知识点,加深印象,检验自己所学。
一、OC中类的介绍
1、OC中类也是一个对象。是属于Class类型。
通过[ClassName class] 和 [ObjectName class] 可以返回对象在内存中所指向的类。
如:Person *p = [[Person alloc] init];
Person *p2 = [[Person alloc] init];
Class c = [p class];
Class c3 = [p2 class];
Class c2 = [Person class];
NSLog(@"%p,%p,%p",c,c2,c3);
上面输出结果相同。标明指向同一个内存地址。
OC中类就是类对象,类对象就是类。因为类本身也是Class类型的对象。和类的对象不同。
Person *p3 = [[[p class] alloc] init]; // 通过类的对象找到对应的类对象,根据类对象在创建类的对象。
分析:[p class] 返回 在内存中的Person类对象。
好处:通过这种方法可以调用类对象里面的类方法。
如:
#import <Foundation/Foundation.h>
@interface Person : NSObejct
+ (NSString*)detail;
@end // Person
@implementation Person
+ (NSString*)detail
{
return @"happy everyday!";
}
@end // Person
int main()
{
Person *p = [[Person alloc] init];
[[p class] detail]; // 调用类方法。
return 0;
}
二、类的加载和初始化。
1、类里面有两个 类方法。
+ (void)load; // 加载,
+ (void) initialize; // 初始化。
特征:当项目启动时,所有的类和分类都会被加载。只会加载一次,加载的顺序是:先父类再子类。
当第一次使用类的时候,类会初始化。顺序也是先父类再子类,所以根据这个特性可以再这个方法里面监听类的使用。
2、如果类有分类。并且也有初始化方法。那么会优先使用分类的初始化方法,如果没有就会调用类的初始化方法。
如:#import <Foundation/Foundation.h>
@interface Animal : NSObject
+ (void) load;
+ (void) initialize;
@end // Animal
@implementation Animal
+ (void) load
{
NSLog(@"Animal_load");
}
+ (void) initialize
{
NSLog(@"Animal_initialize");
}
@end // Animal
@class Animal
@interface Bird : Person
+ (void) load;
+ (void) initialize;
@end // Bird
@implementation Bird
+ (void) load
{
NSLog(@"Bird_load");
}
@ (void) initialize
{
NSLog(@"Bird_initialize");
}
@end // Bird
@interface Bird (znh)
+ (void) load;
+ (void) initialize;
@end // Bird (znh)
#import "Bird+znh.h"
@implementation Bird (znh)
+ (void) load
{
NSLog(@"Bird+(znh)_load");
}
@ (void) initialize
{
NSLog(@"Bird+(znh)_initialize");
}
@end // Bird (znh)
int main()
{
Animal a = [[Bird alloc] init];
return 0;
}
输出结果为:
Animal_load
Bird_load
Bird+(znh)_load
Animal_initialize
Bird+(znh)_initialize
分析:只要项目启动,项目中所有的类和分类都被加载。当类第一次使用时才会初始化,如果存在分类则调用分类的初始化方法。