Desarrollo OC: la naturaleza de la clase (33)

Una visión general

  • La clase también es un objeto, que es un objeto de tipo Class, denominado "objeto de clase" para abreviar
  • Definición de tipo de clase typedef struct objc_clas *Class
  • El nombre de la clase representa el objeto de la clase, cada clase tiene solo un objeto de clase

Relación entre dos tipos.

2.1 persona

//Person.h
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property int age;
+(void)test;
@end
//Person.m
#import "Person.h"
@implementation Person
+(void)test
{
    NSLog(@"Person调用了test++++++");
}
+ (void)load
{
    NSLog(@"Person----load");
}
+(void)initialize
{
    NSLog(@"Person---initialize");
}
@end

2.2 Clase de estudiante (subclase de persona)

//Student.h
#import "Person.h"
@interface Student : Person
@end
//Student.m
#import "Student.h"
@implementation Student
+(void)load
{
    NSLog(@"Student---load");
}
+(void)initialize
{
    NSLog(@"Student---initialize");
}
@end

2.3 Clase GoogStudent (subclase de estudiante)

//GoodStudent.h
#import "Student.h"
@interface GoodStudent : Student
@end
//GoodStudent.m
#import "GoodStudent.h"
@implementation GoodStudent
+(void)load
{
    NSLog(@"GoodStudent---load");
}
+(void)initialize
{
    NSLog(@"GoodStudent---initialize");
}
@end

2.4 Categoría de persona (MJ) (clasificación de personas)

//Person+MJ.h
#import "Person.h"
@interface Person (MJ)
@end
//Person+MJ.m
#import "Person+MJ.h"
@implementation Person (MJ)
+(void)load
{
 NSLog(@"Person(MJ)---load");
}
+(void)initialize
{
    NSLog(@"Person(MJ)---initialize");
}
@end

Tres tipos de esencia

3.1 clase

 Person *p1=[[Person alloc]init];
 Person *p2=[[Person alloc]init];
 Person *p3=[[Person alloc]init];
         
 Class c1=[p1 class];
 Class c2=[p2 class];
 Class c3=[Person class];
 NSLog(@"c1=%p,c2=%p,c3=%p",c1,c2,c3);

3.2 Inicialización de clase (cargar, inicializar)

Person *p=[[Person alloc]init];
Class c=[p class];
       
[Person test];
[c test];
       
 Person *p2=[[c new]init];
 NSLog(@"Person ---%d",p2.age);

Cuatro + carga y + inicialización

4.1 + carga

  • Todas las clases y categorías se cargan cuando se inicia el programa, y ​​el método + load de todas las clases y categorías se llama
  • Cargue la clase primaria primero, luego cargue la subclase: es decir, primero llame + cargue de la clase primaria, y luego llame + cargue de la subclase
  • Cargue la metaclase original primero y luego cargue la categoría
  • Independientemente de si esta clase es útil cuando el programa se está ejecutando, se llamará a + load para cargar

4.2 + inicializar

  • Cuando usa una clase por primera vez (como crear un objeto, etc.), el método + initialize se llamará una vez
  • Una clase solo llamará al método + initialize una vez, primero llama a la clase padre, luego llama a la subclase

4.3 2 formas de obtener objetos de clase

//方式一
Class c=[Person class];//类方法
方式二
Person *p=[Person new];
Class c2=[p class];//对象方法
Publicado 362 artículos originales · 118 alabanzas · 530,000 visitas

Supongo que te gusta

Origin blog.csdn.net/Calvin_zhou/article/details/105445124
Recomendado
Clasificación