码迷,mamicode.com
首页 > 其他好文 > 详细

类的本质

时间:2015-08-05 00:34:58      阅读:190      评论:0      收藏:0      [点我收藏+]

标签:

类的本质
内存分为5大区:栈区存储的是局部变量;程序员自己手动申请存储数据的空间是在堆区,OC的对象就是存储在堆区;常量区,也称为数据段,存储的是已经初始化的全局变量和静态变量;BSS段存储的是未被初始化的全局变量和静态变量;代码区存储的是代码。
类是存储在代码区中,当程序在运行的时候,如果某个类被第1次访问,那么这个类就会被加载到代码段存储。一旦类存储在代码段,那么直到程序结束才会被回收。
将类存储到代码区的步骤:
a. 先在代码段之中创建1个Class对象. Class是1个类. 是Apple写的.
b. 将类的信息存储在Class对象之中.
Class对象的属性至少有如下三个:
Class对象保存的类的名字;
Class对象保存的类的属性们;
Class对象保存的类的方法们 所以,类是以Class对象存储在代码段之中. 这个对象我们也叫做类对象.存储类信息的对象.
拿到类对象有以下两种方法:
1). 调用对象的对象方法class,就可以得到存储这个所属的类的类对象.
2). 调用类的类方法class,也可以得到存储这个类信息的对象.
使用类对象:
1). 可以通过存储类信息的Class对象,来调用这个类的类方法.
Class c1 = [Person class];
c1是个对象,是1个Class对象,这个对象中存储的是Person类.
所以,我们可以认为c1对象就是Person类
所以, 我们可以使用c1来调用Person的类方法.
2). 可以通过存储类信息的Class对象,来调用类方法new来创建对象.
new方法也是Person的类方法也可以使用类对象来调用创建Person对象.
类的方法是以SEL对象的形式.存储在CLass对象之中的. 1个SEL对象就包装了1个方法,然后将这个SEL对象以属性的形式存储在Class对象之中.SEL的全称是selector 选择器,这是一个专门存储类的方法的数据类型。SEL s1 = @selector(方法名);就可以拿到存储这个方法的SEL对象.
调用方法的本质:比如[p1 eat];
1). 先取到存储eat方法的SEL对象. SEL数据.
2). 将这个SEL数据发送给p1对象. 将这个SEL消息发送个p1对象.
3). 对象接收到这个SEL消息以后,就知道你要调用方法 对象就根据isa指针找到存储类的Class对象.
4). 找到对象以后,就根据这个SEL消息查找匹配的SEL对象.
在调用方法的时候,其实是在为对象或者类 发送SEL消息.将方法的SEL消息发送给对象. 对象再根据isa指针找到类对象, 查找是否有匹配的 SEL对象.
手动的向对象发送SEL消息有两种:
1). 使用@selector() 得到包装方法的SEL对象数据.
2). 调用对象的.performSelector 方法将SEL数据发送给对象.
@selector(方法名); 就可以得到包装这个方法的SEL对象.
如果方法带了参数,那么方法的名称是带了冒号的.
在发送SEL数据的时候.performSelector: withObject: 来代入参数.

类的本质

标签:

原文地址:http://www.cnblogs.com/dandaner/p/4703471.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!