黑马程序员——类的本质

来源:互联网 发布:js怎么向div添加东西 编辑:程序博客网 时间:2024/05/21 07:52

---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------


今天看了下mj老师讲的内的本质

其中讲到了,类其实也是一个对象,也就是类对象,当然它的类型是class类型的

当程序启动时,就会加载项目中所有的类和分类,而且加载后会调用每个类和分类的+load方法。只会调用一次。 

 当第一次使用某个类时,就会调用当前类的+initialize方法

先加载父类,再加载子类(先调用父类的+load方法,再调用子类的+load方法)

先初始化父类,再初始化子类(先调用父类的+initialize方法,再调用子类的+initialize方法)


这是m.h

#import <Foundation/Foundation.h>#import "Person.h"#import "Student.h"#import "GoodStudent.h"int main(){        return 0;}

这是一个Person类

#import <Foundation/Foundation.h>@interface Person : NSObject@property int age;+ (void)test;@end#import "Person.h"@implementation Person+ (void)test{    NSLog(@"调用了test方法");}// 当程序启动的时候,就会加载一次项目中所有的类。类加载完毕后就会调用+load方法+ (void)load{    NSLog(@"Person---load");}// 当第一次使用这个类的时候,就会调用一次+initialize方法+ (void)initialize{    NSLog(@"Person-initialize");}@end

在这个main函数运行的时候就会打印我们Person类中的load方法,尽管我们在main函数并没有创建这个类。


然后Mj老师又讲了一个很重要的知识点那就是description

description方法既是类方法也是对象方法。

要判断它目前是什么方法主要是看调用它的是类还是对象

我们可以通过重写description方法来实现打印完整的结果

默认情况下,利用NSLog和%@输出对象时,结果是:<类名:内存地址>

 1.会调用对象p的-description方法

 2.拿到-description方法的返回值(NSString *)显示到屏幕上

 3.-description方法默认返回的是“类名+内存地址”


下面是m.h

#import <Foundation/Foundation.h>#import "Person.h"void test9(){    // 输出当前函数名    NSLog(@"%s\n", __func__);}int main(){      Person *p = [[Person alloc] init];        // 指针变量的地址    NSLog(@"%p", &p);    // 对象的地址    NSLog(@"%p", p);    // <类名:对象地址>    NSLog(@"%@", p);       return 0;}

再下面是Person类

#import <Foundation/Foundation.h>@interface Person : NSObject@property int age;@property NSString *name;@end#import "Person.h"@implementation Person// 决定了实例对象的输出结果- (NSString *)description{    return [NSString stringWithFormat:@"age=%d, name=%@", _age, _name];}

所以在输出结果的时候可以直接打印age和name而不是一个一个的输入。



---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
0 0
原创粉丝点击