你的位置:首页 > 软件开发 > 操作系统 > iOS通过ARC管理内存(内容根据iOS编程编写)

iOS通过ARC管理内存(内容根据iOS编程编写)

发布时间:2016-09-09 08:00:08
栈  当程序执行某个方法(或函数)时,会从内存中一个叫栈的区域分配一块内存空间,这块内存空间我们叫帧。帧负责保护程序在方法内声明的变量的值。在方法内声明的变量我们称之为局部变量。  当我们的程序开始启动,作为程序的入口main函数,他的帧会被保存在栈的地步。当main调用另一个方 ...

  当程序执行某个方法(或函数)时,会从内存中一个叫的区域分配一块内存空间,这块内存空间我们叫。帧负责保护程序在方法内声明的变量的值。在方法内声明的变量我们称之为局部变量。

  当我们的程序开始启动,作为程序的入口main函数,他的帧会被保存在栈的地步。当main调用另一个方法时,这个方**被压入栈的顶部。被调用的方法还会调用其他的方法,这样一直调用,就会形成一个帧序列。当调用的方法执行结束的时候,程序会将其帧从栈顶“弹出”并释放响应的内存。

  所以栈的内存形式是先进后出。

 

  堆是值内存中的另一块区域,是和栈分开的。堆中包含了大量无序的活动对象,需要通过指针来保存这些对象在堆中的地址。当应用向某个类发送 alloc 消息时,系统会从堆中分配出一块内存,其大小为对象的全部的实例变量大小。

  iOS应用在启动和运行时会持续创建需要的对象,如果堆的空间是无限的,则可以随意创建所需的对象。但是可惜,我们可用应用支配的内存空间是很有限的。因此,当应用不再需要某些对象时,就要将其释放掉。释放掉的对象可以将其占用的内存归还给堆,使之能够重新使用。最终要的是,我们要时刻避免释放应用正在使用的对象。

 

  • 指针变量与对象所有权

  指针变量暗含了对其所指向的对象的所有权

  1. 当某个方法(或函数)有一个指向某个对象的局部指针时,可以成该变量拥有该变量所指向的对象。
  2. 当某个对象有一个指向其他对象的实验变量时,可以称该对象拥有该实例变量所指向的对象。
  3. 如果某个对象没有拥有者,就应该将其释放掉。没有拥有者,程序是无法向其发送消息的。保留这样的对象就会造成内存泄漏
  4. 如果某个对象有一个或者多个拥有者,就必须保留下来,不能被释放。如果释放了某个对象,但是其他对象或者方法仍然有指向该对象的指针,那么向该指针指向的对象发送消息就会使应用崩溃。指向不存在的对象的指针称为空指针

  

  那些情况是使对象失去拥有者

  1. 当程序修改某个指向特定对象的变量并将其指向另一个对象的时候就会失去拥有者。
  2. 当程序将某个指向特定对象的变量设置为nil的时候。
  3. 当程序释放对象的某个拥有者的时候
  4. 当从 collection 类中删除对象的时候。

 

  • 强引用与弱引用

  只要指针变量指向某个对象,那么相应的对象就会多一个拥有者,并且不会被程序释放。这种指针特性称为强引用

  程序也可以选择让指针变量不影响其指向对象的拥有者个数。这种不会改变对象拥有者个数的指针特性称之为弱引用。

  弱引用非常适合解决一种称为强引用循环的内存管理问题。当两个或者以上的对象相互之间有强引用特性的指针关联的时候,就会产生强引用循环。这种循环会导致内存泄漏。因为这种循环中程序无法通过ARC机制来释放内存。

  在  RandomItems  添加一处强引用循环,来解释如何解决此类问题。

#import <Foundation/Foundation.h>@interface JXItem : NSObject{  NSString *_itemName;  NSString *_serialNumber;  int _valueInDollars;  NSDate *_dateCreated;    // 这里添加让JXItem对象能够保存另一个JXItem对象。  JXItem *_containedItem;  JXItem *_container;}// 初始化方法- (instancetype)initWithItemName:(NSString *)name         valueInDollars:(int)value          serialNumber:(NSString *)sNumber;- (instancetype)initWithItemName:(NSString *)name;- (void)setContainedItem:(JXItem *)item;- (JXItem *)containedItem;- (void)setContainer:(JXItem *)item;- (JXItem *)container;// 存方法- (void)setItemName:(NSString *)str;// 取方法- (NSString *)itemName;- (void)setSerialNumber:(NSString *)str;- (NSString *)serialNumber;- (void)setValueInDollars:(int)v;- (int)valueInDollars;- (NSDate *)dateCreated;@end

原标题:iOS通过ARC管理内存(内容根据iOS编程编写)

关键词:IOS

IOS
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。