iOS设备中,内存被人为的分成5大区域
:栈区、堆区、全局/静态区、常量区、代码区
,所占内存都为系统分配的虚拟内存
。
布局结构如图:
局部变量和方法的参数
(方法中默认参数:self、cmd),都存放在栈区;系统管理
,申明的变量过了作用域范围后内存便会自动释放;一块连续的内存区域
从从高地址向低地址
进行存储,遵循FILO先进后出
原则。alloc、malloc
等内存分配方式创建的变量;不连续的内存区域
,类似于链表结构
(便于增删,不便于查询),遵循先进先出(FIFO)原则;生命周期为整个程序运行期
生命周期为整个程序运行期
整型、字符型,浮点,字符串等
,用const
进行修饰的变量;NSLog(@"字符串地址:%p",@"constq3123");
NSLog(@"常量地址:%p",&constStr);
static NSString *staticStrUn;
static NSString *staticStr = @"constq3123";
NSLog(@"静态变量地址:%p",&staticStr);
NSLog(@"未初始化静态变量地址:%p",&staticStr);
HRTest * test = [HRTest alloc];
NSLog(@"对象地址:%p",test);
NSLog(@"局部变量指针地址:%p",&test);
-(void)say{
NSLog(@"方法参数self:%p",&self);
NSLog(@"方法参数cmd:%p",&_cmd);
}
输出:
通过一些简单的方式进行验证。
问:define和const声明的变量有什么区别?
预编译阶段
进行代码的替换,每使用一个位置就需要进行一次内存的开辟;存放在常量区
,在编译阶段就生成了,所以只需要进行一次内存的开辟,后续使用直接返回内存地址
,比较节省内存;