oc学习之对象在内存的位置
对象在内存中的存储
1. 内存中的五大区域.
栈: 存储局部变量.
堆: 允许程序员手动在堆区申请指定的连续的字节数的空间来使用.
BSS段: 存储未初始化的全局变量、静态变量.
数据段(常量区): 存储已经初始化的全局变量、静态变量、常量数据.
代码段:存储程序的代码.
2. 类加载.
1). 当创建对象的时候,肯定需要访问这个类.因为只有访问了类才知道类中有那些成员.
2). 如果只是声明类指针的时候,也会访问这个类.以确定这个类型是否存在.
当类第一次被访问的时候,会将类存储到代码段之中. 这个过程叫做类加载.
将类的代码存储在代码之中.
将类的代码以字符串的形式存储在代码段中.
只有类第1次被访问的时候,才会有类加载.
一旦类被加载到代码区.直到程序结束的时候才会被回收.
3.对象在内存中是如何存储的.
1). 类的本质是:自定义的数据类型.
HMPerson *p1 = [HMPerson new];
2). HMPerson *p1;
这句话,仅仅是声明了1个指针变量而已.这个指针变量的类型是HMPerson*.
p1是1个局部的变量.所以p1指针变量是存储在栈区的.
p1是1个指针变量,所以这个变量中只能存储地址.
本质上来讲.p1是1个指针变量 不是1个对象.
3).[HMPerson new];
这句话,才是在真正的创建对象.
new做的事情.
a. 在堆内存中申请一块合适大小的空间.
b. 在申请的这块空间中根据类的模板创建对象.
类中有哪些属性.就把类的属性依次的挨个的一个不落的声明在这个对象中.
对象中除了有类中定义的属性之外,还有1个属性叫做isa 这是1个指针.
这个isa指针指向代码段中的类.
c. 初始化对象的属性.为对象的属性赋默认值
-> 如果属性的类型是基本数据类型.就赋值为0
-> 如果属性的类型是C指针类型.就赋值为NULL
-> 如果属性的类型是OC指针类型.就赋值为nil
d. 返回这个对象在堆空间中的地址.
将这个地址赋值给p1指针.
p1指针指向了堆空间中的HMPerson对象.
4). 注意
a. 对象中只有类的属性+isa的指针. 没有方法.
isa指针指向了代码段中的类.
b. 如何访问对象的属性.
通过指针就可以找到指针指向的对象.找到对象了,就可以找到对象的属性.
p1->_name = @"jack";
c. 如何调用对象的方法?
[p1 sayHi];
通过p1指针找到对象,发现是在调用方法.那么再根据对象的isa指针找到代码段中的类.
再找到类中的对应的方法来执行.
d. 为什么方法不保存在对象中.
因为不管对象有多少个.方法的代码都是一样的.没有必要保存多份,只保存1份就可以了.
e. 相同类的对象的isa指针的值一定都是一样的.
4. 对象的属性的初始值.
创建1个对象 如果没有为这个对象的属性赋值.那么这个对象的属性是有值的.
属性的类型是基本数据类型: 0
OC指针: nil
C指针: NULL
Nil
1. C语言中学习的NULL.
a). NULL是1个值. 是C语言中指针变量的值.
b). 如果1个指针的值为NULL值,就代表这个指针不指向内存中的任何空间.
c). NULL本质上是1个宏.
define NULL ((void*)0)
所以 NULL 和 0 等价.
2. nil
a). nil也是1个值. 它也是1个指针变量的值.
b). nil的本质也是1个宏.
#define __DARWIN_NULL ((void *)0)
所以,nil和NULL完全是等价的.
c). 所以,如果
想要让1个指针不指向任何空间.
可以为这个指针变量赋值为NULL nil 0
3. 使用建议
a). 如果希望C指针不指向任何空间.一般为其赋值为NULL
b). 如果希望OC指针不指向任何空间,一般赋值nil
4. 注意问题
如果1个类指针的值为nil
HMPerson *p1 = nil;
代表p1指针不指向任何对象.
1). 所以这个时候 通过p1去访问p1指向的对象的属性的时候,肯定的会报错.
对象都没有 哪里来的属性呢?
2). 这个时候, 通过这个指针去调用方法的时候,
不会报错.也不会崩溃.
只是没有任何反应的啦.
分组导航标记
1. 一种快速的方式查找文件中的代码.
Xcode 提供了导航条可以快速查找.
2. 分组导航标记.
1). #pragma mark 标记名.
2). #pragma mark - 就会产生1条分割线.
3). #pragma mark - 标记名. 就会产生1条分割线.并取1个标记名.
方法与函数
1. 之前在C语言中叫做函数.
void test();
在OC类中定义的叫做方法.
- (void)sayHi;
2. 相同点:
1). 都封装1段代码,都表示1个相对独立的功能.
2). 函数/方法 如果不被调用,那么其中的代码是不会被执行.
3. 不同点.
1). 语法不同.
2). 定义的位置不一样.
a. 函数除了函数的内部和@interface的大括弧中不能定义.其他的地方都是可以定义的.
b. 而方法的声明只能在@interface的大括弧的外面,实现只能在@implementation中.
就算把函数写在类中,这个函数也不是属于这个类的.
3). 归属感不同.
a, 函数就像是1个没有家的孩子,每1个函数是孤立的.]
b. 方法是属于类的.类就是方法的家.
4). 调用形式不同.
a. 函数直接调用.
b. 方法必须要通过对象名来调用.
oc学习之对象在内存的位置的更多相关文章
- OC学习16——对象归档
转载自 OC学习篇之---归档和解挡 OC中的归档就是将对象写入到一个文件中,Java中的ObjectInputStream和ObjectOutputStream来进行操作的.当然在操作的这些对象都 ...
- JVM学习03_new对象的内存图讲解,以及引出static方法(转)
目录 -=-讲解对象创建过程中,-=-堆内存和栈内存的情况 -=-构造函数对类对象的成员变量的初始化过程 -=-构造函数出栈 -=-类的方法在不访问类对象的成员变量时造成的内存资源浪费怎么解决? -= ...
- Java基础(2)面向对象和封装,对象的创建和使用、java对象的内存图
1 类和对象 类:是一类事物的描述,抽象的.猫 对象:是一类事物的实例,具体的.某只猫 2 类的定义 成员变量和成员方法 //定义一个学生类 public class Student { //成员变量 ...
- OC学习10——内存管理
1.对于面向对象的语言,程序需要不断地创建对象.这些对象都是保存在堆内存中,而我们的指针变量中保存的是这些对象在堆内存中的地址,当该对象使用结束之后,指针变量指向其他对象或者指向nil时,这个对象将称 ...
- OC学习5——类和对象
1.OC是在C语言基础上进行扩展得到的一门面向对象的程序设计语言,它也提供了定义类.成员变量和方法的基本功能.类可以被认为是一种自定义的数据类型,使用它可以定义变量,所有使用类定义的变量都是指针类型的 ...
- oc对象的内存管理
oc没有java的垃圾回收机制,所以对象的内存释放很重要,基本数据类型,我们不用理会,编译器会处理: oc的每个对象内部都由一个计数器,用来记录当前有几个指针在指向该对象:当计数器为0时该对象会从内存 ...
- ios开发:OC对象的内存分析
最近要开始准备找实习单位了,做做笔试题,看看各位大神的面试经历,发现自己要学习的东西真的还有很多,虽然也做过几个的项目,但是真正拿过笔试题一看,才发现自己对基础这方面的东西,确实有点忽视了,所以最近开 ...
- OC学习6——面相对象的三大特性
我们在学习Java的时候都知道,类有三大特性:继承,封装,多态,这也是面向对象的三大特征.OC学习篇之---类的三大特性(封装,继承,多态) 1.封装(Encapsulation)是指将对象的状态信息 ...
- [javase学习笔记]-6.3 对象的内存体现
这一节我们来简单的看一看对象在内存中是什么样子呢,怎样体现. 我们以上一节的測试代码为例. 我们在函数的内存分配分析过.当该代码执行时,首先会载入主函数在栈内存中为main函数分配一个空间: 然后执行 ...
随机推荐
- C# 标签(条码)
C# 标签(条码) 上一篇说到条码的打印,主要是通过读取模板定义文件(XML文件),然后结合从数据库中读取的动态数据结合而产生条码.下面主要说一下如何设计这个条码模板.设计过程也很简单,只需要简单的拖 ...
- Mysql之IN 和 Exists 用法
1.基本用法 IN:后面的子查询 是返回结果集的,换句话说执行次序和Exists()不一样.子查询先产生结果集,然后主查询再去结果集里去找符合要求的字段列表去.符合要求的输出,反之则不输出. Exis ...
- MVC 用扩展方法执行自定义视图,替代 UIHint
MVC 用扩展方法执行自定义视图,替代 UIHint 项目中用了 Bootstrap , 这样就不用写太多的CSS了,省去很多事情.但是这个业务系统需要输入的地方很多,每个表都有100多个字段,每个页 ...
- 制作iis自动安装包
原文:制作iis自动安装包 MS 一直没有提供可独立安装的 IIS 安装包,Windows 的缺省安装没有安装它,通常要到控制面板的"添加/删除 Windows 程序"中去选择安装 ...
- 探索Android该Parcel机制上
一.先从Serialize说起 我们都知道JAVA中的Serialize机制.译成串行化.序列化……,其作用是能将数据对象存入字节流其中,在须要时又一次生成对象.主要应用是利用外部存储设备保存对象状态 ...
- BackgroundWorker组件使用总结
首先在窗体拖入一个BackgroundWorker组件,根据功能需要设置BackgroundWorker的属性 WorkerSupportsCancellation = true; 允许取消后台正在执 ...
- jQuery获取Radio选择的Value值||两个select之间option的互相添加操作(jquery实现)
jQuery获取Radio选择的Value值: 1. $("input[name='radio_name'][checked]").val(); //选择被选中Radio的Val ...
- NET框架SOA解决方案(集Windows服务、WinForm形式与IIS形式发布)-分布式应用
NET框架SOA解决方案(集Windows服务.WinForm形式与IIS形式发布)-分布式应用 RDIFramework.NET,基于.NET的快速信息化系统开发.整合框架,给用户和开发者最佳的.N ...
- SZU:L89 Frog Encoding
Judge Info Memory Limit: 65536KB Case Time Limit: 3000MS Time Limit: 3000MS Judger: Normal Descripti ...
- IP数据报是如何在网络中转发的?
首先发送方抽取目的站的网络前缀,来判断是否目的站是否位于同一网络上,如果在二者有相同的网络前缀,则,直接使用直接交付的方式, 否则,使用由路由器互连的间接交付,这要借助IP路由表,采用表驱动法,路由表 ...