黑马程序员--IOS_学习笔记_类的本质

------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


分析:只要项目启动,项目中所有的类和分类都被加载。当类第一次使用时才会初始化,如果存在分类则调用分类的初始化方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值