黑马程序员---oc类的深入研究!

来源:互联网 发布:在安卓手机上编程 编辑:程序博客网 时间:2024/06/02 05:10

1.类的本质:


1>类本身也是一个对象,是一个Class类型的对象,简称类对象。


1.创建一个Person类对象p

#import "Person.h"  #import <Foundation/Foundation.h>    int main(int argc, const char * argv[]) {                Person *p = [[Person alloc] init] ;              return 0;  }  


2.创建Person类对象,内存中状态如下图所示:



当创建一个Person类对象的时候,会将对象的成员变量放在Person类对象中,并且在Person类对象中存在一个isa指针指向Person类,并且在内存中Person类只有一份,并且存储供各个类对象访问的类方法。这样看来其实Person类也是一个对象,而他时一个Class类的对象


2>经过上面的分析大家应该懂得了,Class类对象Person类型对象的区别把。接下来我们用Person类对象(Class类对象)创建Person类型对象(Person类的对象) :

#import "Person.h"  #import <Foundation/Foundation.h>    int main(int argc, const char * argv[]) {                Person *p = [[Person alloc] init] ; //创建Person类型的对象     Class c = [p class] ;  //从内存中获取Person类对象    Person *p1 = [[c alloc] init] ;  //使用Person类对象c创建Person类型的对象    return 0;  } 



2.类的加载和初始化:

1>当程序启动的时候,就会加载项目中的所有的类。类加载的完毕的时候时候会调用load方法(类方法)。

eg:

#import "Person.h"@implementation Person//类一加载就调用该方法(类方法)。+ (void) load{    NSLog(@"Person--load") ;}@end


2>当第一次使用类的时候,就会调用一次initialize方法(类方法)。

eg(在原来基础上添加类初始化方法):


#import "Person.h"@implementation Person//类一加载就调用该方法(类方法)。+ (void) load{    NSLog(@"Person--load") ;}//类在第一次初始化的时候被调用。+ (void) initialize{    NSLog(@"Person--initialize") ;}@end



3.使用注意:

1>在父类若都有实现load的方法,在类加载完毕之后都会调用父类load方法,并且load方法只调用一次。

在2基础上新建一个student类继承Person类

eg:

Student.m

#import "Student.h"@implementation Student//类一加载就调用该方法(类方法)。+ (void) load{    NSLog(@"Student--load") ;}@end



之间执行程序,在系统加载完类之后就会打印如下结果:

Person -- load

Student--load


2>load的调用顺序:先调用父类的load方法,在调用子类的load方法。因为创建子类对象的时候需要先加载父类。


3>若在类中实现initialize只会在第一次使用类的时候调用


eg:

#import "Person.h"  #import <Foundation/Foundation.h>    int main(int argc, const char * argv[]) {                Person *p = [[Person alloc] init] ;        Person *p1 = [[Person alloc] init] ;      return 0;  }  
虽然在以上main函数中创建了两次对象,但是只会调用一次initialize方法。

4>若在子类Student类中也实现了initialize方法,调用顺序是先调用父类的initialize方法在调用子类的initialize方法

eg(在子类中添加初始化方法):

#import "<span style="font-family: Arial, Helvetica, sans-serif;">Student</span><span style="font-family: Arial, Helvetica, sans-serif;">.h"</span>@implementation <span style="font-family: Arial, Helvetica, sans-serif;">Student</span>//类一加载就调用该方法(类方法)。+ (void) load{    NSLog(@"<span style="font-family: Arial, Helvetica, sans-serif;">Student</span>--load") ;}//类在第一次初始化的时候被调用。+ (void) initialize{    NSLog(@"Student--initialize") ;}@end


main.m

#import "Student.h"  #import <Foundation/Foundation.h>    int main(int argc, const char * argv[]) {                Student *p = [[Student alloc] init] ;            return 0;  }  


输出结果:

Person -- load(类加载调用load的方法)

Student--load

Person--initialize(先加载父类的initialize,调用本身的initialize方法)

Student--initialize



0 0