黑马程序员---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
#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
- 黑马程序员---oc类的深入研究!
- 黑马程序员—OC语言基础—类的深入研究
- 黑马程序员_类的深入研究
- 黑马程序员--较深入研究@property
- 黑马程序员-oc-Block
- 黑马程序员————OC中类的深入研究和SEL基本用法总结
- OC类的深入研究
- OC类的深入研究
- 12、黑马程序员-OC类的深入和分类
- 黑马程序员---OC category
- 黑马程序员---OC封装
- 黑马程序员---OC Category
- 黑马程序员---OC autorelease
- 黑马程序员---OC ARC
- 黑马程序员---oc block
- 黑马程序员--oc分类
- 黑马程序员--oc中的ARC
- 黑马程序员-OC-继承
- 11.2 对数组归并排序
- 从裸机编程到嵌入式Linux编程思想的转变------分而治之:驱动和应用程序
- POJ2155:Matrix(二维树状数组,经典)
- 与linux相处的日子里
- tableWidget用法
- 黑马程序员---oc类的深入研究!
- 屏幕适配的理解
- iOS9地图增公共交通导航功能 中国300个城市可用
- 找到突破的点——认识自己
- NSPredicate谓词(过滤)
- 学长的疑惑???
- shell学习二十五天----神器的管道符
- 1030. Travel Plan (30)
- 日语学习之沪江N3基础 20150624 -3