堆(heap):
是指内存中的一块区域,应用中的所有对象都会保存在堆中,而非Object-C 对象一般放在栈里,栈内存会被系统回收。当应用向某个类发送alloc消息时,系统会从堆中分配出一个内存,其大小足够存放相应对象的全部实例变量。
e.g.:
以下以:NSDate对象为实例来解释实例的内存分配问题:
该对象可以代表某个特定的时间点。它包含2个实例变量:一个时double类型的变量(用于保存从某个固定的时间点算起的时间差,单位秒),另一个是继承自NSObject的isa指针(所有的对象都会继承)。一个double变量的大小是8个字节,而一个指针变量大小是4个字节。因此,当NSDate类型收到alloc消息时,系统会为堆上新的NSDate 对象分配一个大小为12个字节的内存
注:
一个对象永远不会直接保存另一个对象,所有的对象在堆中都是独立存在的。
(栈)stack:
是指内存中的另一块区域,和堆是分开的。
堆:包含大量无序的对象,需要通过指针来保存这些对象在堆中的地址,
栈:则会按后进先出的规则保存一组帧(frame),当程序执行某个方法(或函数)时,会从栈中分配一块内存空间,这块内存空间称为栈帧。
栈帧。栈帧负责保存程序在方法内的声明的变量的值。从方法内声明的变量叫局部了变量
当某个应用程序启动并运行main函数时,他的栈帧数会被保存在栈的底部。当main调用另一个方法(或函数)时,这个方法(或函数)的栈帧会被压入栈的顶部。被调用的方法还可以再调用其他方法,依次类推,最终会在栈中形成塔状的栈帧序列。当被调动的方法结束时,程序会将其栈帧从栈中“弹出”并释放。如果同一次的方法再次被调用,则应用会创建一个全新的栈帧,将其压入栈顶
变量:
成员变量与属性
成员变量:成员变量默认是@protected,外部如果要调用,需要在头文件中声明,并设置为@public
属性:
若在.h 文件中声明,则外部可以用,若在.m文件中声明,则类内可以用
局部变量:
定义:写在函数或代码中的变量,称之为“局部变量”
作用域:从定义的那一行开始,直到大括号或者return
存储: 栈
全局变量:
定义:写在函数和大括号之外的变量,我们称之为全局变量
作用域:从定义的那一行开始,一直到文件末尾
存储:静态区
静态变量:
定义;在变量声明前加上关键字static
作用域:静态局部变量,静态全局变量
存储:静态区