博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS的内存管理
阅读量:2351 次
发布时间:2019-05-10

本文共 2317 字,大约阅读时间需要 7 分钟。

在还没有ARC机制之前,都是进行手动的内存管理

1:程序都是依托在ios 系统中的,当程序小号系统内存

为40M时,会有一个内存警告;达到45M时,会再有一个内存警告;达到120M时,系统会将程序强行退出,即闪退,引起闪退的另一个因素是逻辑错误。

2:当创建一个对象时,系统会做三件事

》1:分配内存空间,存储对象

》2:初始化成员变量

》3:返回对象的指针地址

3:

》1:对象在完成创建的同时,内部会自动创建一个引用计数器,这个计数器,是系统用来判断是否回收对象的唯一依据,当我们的引用计数器retainCount = 0的时候,系统会毫不犹豫回收当前对象

》2:[对象 release]  retainCount - 1

》3:[对象 retain]   retainCount  +1 ,返回self

》4:我们的引用计数retainCount =0 ,对象就被销毁了

》5:dealloc 函数,当一个对象要被销毁的时候,系统会自动调用dealloc函数,通知对象将要被销毁

4:

》1:创建一个对象   Person *p = [[Person alloc]init];

》2:set方法内存分析,内存泄露主要是因为set方法,需要重写对象的set /get方法,如在.h文件中

-(void)setCar:(Car *)car

{

     if(_car != car)

     {

         //release 旧值

          [_car    release];

         //retain新值

          _car =  [car  retain];

     }

}

-(Car *)car

{

   return  _car;

}

》3:在.h文件中重写dealloc函数

-(void)dealloc

{

    //目的是要保证在p对象存在的时候,car对象一定存在。如果一个对象被声明成了成员变量或者是使用@property生成的符合内存管理的set方法,那么一定要在dealloc函数对应一次release操作

    [_car  release];

    //在对象自身被销毁之前,一定要先调用[super dealloc]释放父类中的相关对象

    [super dealloc];

    NSLog("@Person 被销毁了");

}

 

5:内存管理原则(配对原则):只要出现了new , alloc, retain ,就一定配对出现一个release,autorelease

手动内存管理主要研究问题

》1:野指针操作 :当我们一个对象的retainCount=0时,保存了这个指针地址的变量再去使用他去操作这个对象的所有方法,将会发生野指针操作

》2:内存泄露:不再被使用的对象,一直在内存中没有被销毁

6:

》1:避免野指针操作的方法:如果你确定当前作用域中的对象已经不会再被使用了,为了防止野指针操作,通常我们会把不再使用的指针变量赋值为nil ,即 p = nil ;

》2:当一个对象retainCount已经为0时,再调用retain方法,是不会使得对象起死回生的,同时还会发生野指针操作异常

 

7:EXC_BAD_ACCESS 错误,表明访问了不可访问的内存空间。

 被系统回收的对象我们称之为僵尸对象,默认情况下xcode为了提高编码效率,不会时时检测僵尸对象。想要打开xcode的时时检测僵尸对象功能,可以 在Edit Scheme  -> Run下的Diagnostics下的Enable Zombie Objects  前面方框中打钩。

8:@property  Car * car;   做了以下三件事

》1:生成get.set方法的声明

》2:生成get.set 方法的简单实现

》3:如果没有声明相对应的成员变量,那么他会自动生成一个_开头的成员变量,并且是私有的

-(void)setCar:(Car *)car

{

     _car=car;

}

-(Car *)car

{

   return  _car;

}

9:@property  参数分为4类

》1:与set方法内存管理相关参数

retain :要生成符合内存管理原则的set方法(应用于对象类型)

assign:直接赋值(对象类型,基本数据类型(int ,float,double,char))

copy

》2:多线程相关

nonatomic:不生成多线程相关代码,iOS开发使用这个就可以了(效率高一点),实际开发中,只要是对象类型的@proerty就用nonatomic

atomic:生成多线程相关代码(mac 开发  ,不写默认是这种方式)

》3:是否要生成set和get方法

readwrite:可读可写属性,同时生成生成set和get方法

readonly:只读属性,只生成get方法

》4:set与get方法名称相关的参数

setter:设置生成的set方法名称

getter:设置生成的get方法名称

如 @property (nonatomic,assign,setter=abc:,getter = cde)int height;

 -(void)setHeight:(int)height;

-(int)height;

调用时

[p  abc:50];

NSLog(@"%d",p.height);

(改变set和get方法名称很多都是用在BOOL类型的变量中)

如@property(nonatomic,assign,setter = isDeid:,getter = isDeid) BOOL isDeil;

[p isDeid:YES];

[P isDeid];

p.isDeid = YES;

BOOL result = p.isDeid;

转载地址:http://sxrvb.baihongyu.com/

你可能感兴趣的文章
10.装饰模式--Decorator
查看>>
11.组合模式--Composite
查看>>
12.轻量模式--Flyweight
查看>>
13.外观模式--Facade
查看>>
14.代理模式--Proxy
查看>>
15.模板模式--Template
查看>>
16.策略模式--Strategy
查看>>
开源史上最成功的八个开源软件
查看>>
More Effective C++读书笔记
查看>>
关于assert,ASSERT,TRACE和VERIFY
查看>>
关于C++中野指针的说明
查看>>
_USRDLL _AFXDLL _WINDLL 三种dll编译宏的具体含义
查看>>
面试中的C++常见问题
查看>>
STL中的string和wstring的格式化方法之一
查看>>
STL中的string和wstring的格式化方法之二
查看>>
socket套接字TCP API说明
查看>>
easyui菜单项的置灰操作
查看>>
js数组的操作
查看>>
jquery的html、text和val方法
查看>>
浏览器的定制与扩展
查看>>