------- ios培训android培训java培训、期待与您交流! ----------

黑马程序员 分类,类的本质,类加载与初始化,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;

}

posted on 2014-05-08 08:45  wtb  阅读(96)  评论(0编辑  收藏  举报

导航

------- ios培训android培训java培训、期待与您交流! ----------