OC基础复习(二)之对象的存储细节

1.内存分为5大区:栈区,堆区,Bss段,数据区,代码区(排序方式:由高地址-->低地址)

其中注意:栈区对象的地址分配是先分配高地址,再分配低地址,(通俗讲就是在栈区中存的变量,先从地址高的开始往下存)

    堆区是从低地址开始分配,再分配到高地址  如下图;

栈区:存储局部变量

什么是局部变量?

答:局部变量是相对于全局变量而言,通常理解为程序中的函数体内部定义的变量

 局部变量和全局变量的区别:

1. 作用域不同:全局变量的作用域为整个程序,而局部变量的作用域为当前函数或循环等

2. 内存存储方式不同:全局变量存储在全局数据区中,局部变量存储在栈区

3. 生命期不同:全局变量的生命期和主程序一样,随程序的销毁而销毁,局部变量在函数内部或循环内部,随函数的退出或循环退出就不存在了

4. 使用方式不同:全局变量在声明后程序的各个部分都可以用到,但是局部变量只能在局部使用。函数内部会优先使用局部变量再使用全局变量

 

 

堆区:存储程序运行的过程中动态分配的内存空间(通俗的理解就是实例对象,例如:Person *p = [Person new],这块内存空间就是指针变量p指向的这个空间)

 

堆区其实就是存放的成员变量或者说成员属性,什么意思呢?就是我们定义了一个类,其中类的一些属性就是称之为成员变量.

Bss段:存储未初始化的全局变量和静态变量

这里又牵扯到了一个概念:

静态变量:静态变量又被划分为静态局部变量和静态全局变量,

静态局部变量:静态局部变量存储方式也是静态存储方式,

第一:静态局部变量在函数内定义,但不像自动变量那样,当调用时就存在,退出函数时就消失。静态局部变量始终存在着,也就是说它的生存期为整个源程序。

第二:静态局部变量的生存期虽然为整个源程序,但是其作用域仍与自动变量相同,即只能在定义该变量的函数内使用该变量。退出该函数后, 尽管该变量还继续存在,但不能使用它。

第三:允许对构造类静态局部量赋初值。若未赋以初值,则由系统自动赋值。数值型变量自动赋初值0,字符型变量赋空字符

第四:对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。 根据静态局部变量的特点, 可以看出它是一种生存期为整个源文件的量。虽然离开定义它的函数后不能使用,但如再次调用定义它的函数时,它又可继续使用, 而且保存了前次被调用后留下的值。 因此,当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量。虽然用全局变量也可以达到上述目的,但全局变量有时会造成意外的副作用,因此仍以采用局部静态变量为宜。

静态全局变量:就是在全局变量前加一个static,但和全局变量的区别是,虽然二者存储区域一样(都在bss段中),存储方式也一样,都是静态存储方式,但是作用域不同,

全局变量作用域是在整个源程序,即一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的,而静态全局变量只在定义该变量的源文件内有效,

在同一源程序的其它源文件中不能使用它.但二者生命周期相同都是存在于整个源程序.

数据区:存储已经初始化的全局变量和静态变量和常量

代码区:存储函数体的二进制代码

 

类创建对象,每个对象在内存中都占有存储空间,每个对象都有

一份属于自己的单独的成员变量

每个对象都包含一个isa指针,这个指针指向当前对象所属的类

给成员变量赋值:图解:

byd->_speed = 120;

程序会先找到byd对象(指针变量),然后通过指针指向的地址找到成员变量_speed,继而给成员变量赋值

 

通过对象去调用方法:

这个时候会用到isa指针,isa指针会指向当前对象所属的类,即会指向代码区(代码区存放的是以二进制形式存放的当前类的代码)

byd对象实际上就是调用的代码区的run方法

 

  1. UTF-8 国际通用编码,一个汉字占3个字节  (Xcode默认格式)
  2.  GB2312  国内标准  一个汉字占两个字节  GBK

未完待续.........................

 

posted @ 2016-10-15 17:30  忆缘晨风  阅读(219)  评论(0编辑  收藏  举报