黑马程序员_OC学习之类的深入研究

来源:互联网 发布:d在c语言中是什么意思 编辑:程序博客网 时间:2024/06/11 15:38
---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------


前言:OC中类其实也是一个对象,这个对象为Class类型。当程序运行时,会先给类对象分配一块内存,程序会自动调用相关方法让我们监听动作。


一、+ (void)Load:当程序第一次运行时,会加载项目中所有的类,当类加载完毕后会调用+load方法。


例如:


<span style="font-size:18px;">#import <Foundation/Foundation.h>@interface Person : NSObject@end@implementation Person+ (void)load {    NSLog(@"Person Load");}@end@interface Student : Person@end@implementation Student+ (void)load {    NSLog(@"Student Load");}@end@interface Person(J)@end@implementation Person (J)+ (void)load {    NSLog(@"J Load");}@endint main() {                //主函数没有调用Person方法但还是会调用类的load方法    return 0;    }</span>


注意:load顺序为先加载父类,再加载子类,最后加载分类。

----------------------------------------------------------------------------------------------------------------------------------------------------------


二、+ (void) initialize:类对象的初始化方法,当第一次使用类时,会调用这个方法。


例如:


<span style="font-size:18px;">#import <Foundation/Foundation.h>@interface Person : NSObject@end@implementation Person+ (void)initialize {    NSLog(@"Person initialize");}@end@interface Student : Person@end@implementation Student+ (void)initialize {    NSLog(@"Student initialize");}@end@interface Person(J)@end@implementation Person (J)+ (void)initialize {    //会覆盖掉Person类本身的initialize方法    NSLog(@"J initialize");}@endint main() {        Student *s = [[Student alloc] init];    //当使用到这个类时,会先加载父类initialize,再加载子类的该方法,如果该类的分类也重写了该方法,那么就不会调用本类的方法,而是该分类的方法        return 0;    }</span>


注意:如果该类的分类也重写了initialize方法,那么就不会调用本类的方法,而加载该分类的方法。

----------------------------------------------------------------------------------------------------------------------------------------------------------


三、description

1、- (NSString *)description:对象方法。配合NSLog并重写该方法可以一次性输出对象的所有信息。


我们知道,NSLog中打印一个OC对象用%@。


例如:


<span style="font-size:18px;">#import <Foundation/Foundation.h>@interface Person : NSObject@property(nonatomic,assign)int age;@property(nonatomic,retain)NSString *name;@end@implementation Person- (NSString *)description {    return [NSString stringWithFormat:@"年龄=%d,姓名=%@",_age,_name];   //重新定义输出格式}@endint main() {        Person *p = [[Person alloc]init];    p.age = 10;    p.name = @"张三";        NSLog(@"%@",p); //一次性输出所有信息        return 0;    }</span>

----------------------------------------------------------------------------------------------------------------------------------------------------------

2、+ (NSString *)description:对象方法,功能同上,区别在于打印输出类的信息


例如:


<span style="font-size:18px;">#import <Foundation/Foundation.h>@interface Person : NSObject@property(nonatomic,assign)int age;@property(nonatomic,retain)NSString *name;@end@implementation Person+ (NSString *)description {    return @"Person";   //打印输出类的信息}@endint main() {        Class P = [Person class];        NSLog(@"%@",P); //根据重新方法输出相关信息        return 0;    }</span>


注意:不要在description里面输出self,因为会无限调用,引发死循环。


---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------详细请查看:www.itheima.com
0 0