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

---------------------- 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");
}

@end

int 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");
}

@end

int 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];   //重新定义输出格式
}

@end


int 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";   //打印输出类的信息
}

@end


int main() {
    
    Class P = [Person class];
    
    NSLog(@"%@",P); //根据重新方法输出相关信息
    
    return 0;
    
}</span>


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


---------------------- ASP.Net+Unity开发.Net培训、期待与您交流! ----------------------详细请查看:www.itheima.com
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值