OC加强第一天--内存管理MRC、@property参数

来源:互联网 发布:大数据的理解 编辑:程序博客网 时间:2024/05/16 07:28

. 内存管理概念

1,为什么要有内存管理?

一般的内存 4s 512M内存;61024M内存;

当内存过大时,会耗尽内存。出现程序闪退。


2OC内存管理的范围

管理任何继承NSObject的对象,对其他的基本数据类型无效。


3、对象类型是程序运行过程中动态分配的,存储在堆区;内存管理主要是对堆区中的对象的内存管理。



4OC内存管理的原理

对对象的引用计数器(retaincount)进行管理,retaincount变为0的时候系统会回收内存.


5、内存管理的分类:

MRC(MannulReference Counting),手动管理;

ARC(automatic reference counting),自动引用计数管理;


//对象的销毁

当一个对象的引用计数器为0,那么它将被销毁,其占用的内存被系统回收。

当对象被销毁时,系统会自动向对象发送一条dealloc消息,一般会重写dealloc方法,在这里释放相关的资源,dealloc就像是对象的临终遗言

一旦重写了dealloc方法就必须调用[super dealloc],并且放在代码块的最后调用(不能直接调用dealloc方法)

一旦对象被回收了,那么他所占据的存储空间就不再可用,坚持使用会导致程序崩溃(野指针错误)


6,内存管理法则

6.1,内存管理的原则(必须要遵守这个原则)

谁创建(allocnew),谁release或者autorelease//谁创建,谁释放

retainmutableCopy(copy),谁releaseautorelease//谁引用,谁释放


6.2、内存管理研究的内容

野指针(僵尸对象)

内存泄露



.单个对象内存管理

1、野指针

野指针未初始化的指针或者 所指向的内存已经被释放的指针。

僵尸对象内存被回收的对象称为僵尸对象;

(默认情况下xcode为了提高编码效率,不会时时检查僵尸对象,所以默认不打开检测僵尸对象的选项)



2、内存泄露

内存泄露  (栈区的指向已经释放堆区的空间没有释放, 这时堆区的空间就被泄露了)

泄露原因:

2.1对象创建了之后,没有release

2.2retain   alloc 的总和大于 releaseautorelease的和;



面试题:

nilNilNULLNSNull的区别:


nil 是一个对象空值;如果我们要把一个对象设置为空的时候就用nil;


Nil:是一个类对象的空值,如果我们要把一个Class类型的对象设置为空的时候就用Nil ;


NULL 是一个c语言指针空值;


NSNull  是一个对象,它用在不能使用nil的场合;




. 多个对象内存管理


set方法的内存管理

1)基本数据类型或者C语言的构造类型:直接赋值

int float doublelong structenum

-(void)setAge:(int)age

{

    _age=age;

}



2)OC对象类型

-(void)setCar:(Car *)car

{

    //1.先判断传进来的是不是原来的对象

   if(car!=_car){

        //2 对旧对象做一次release

        [_car release];//若没有旧对象,则没有影响

        //3.对新对象做一次retain

        _car=[car retain];

        

    } 

}



四,@property参数(有三类共7)


@property xcode4.4

@property帮我们生成getset方法的声明

我们自己实现 getset方法

@property @synthesize联合


@property xcode 4.4

@property 增强

@property int age;

1)生成一个_age

2)生成getset方法的声明

3)生成 getset方法的实现


@property (......)int age;


1.读写属性

readonly:只读,只会生成getter的声明和实现

readwrite:默认的,同时生成settergetter的声明和实现


2)(原子性)多线程管理(苹果在一定程度上屏蔽了多线程操作)

nonatomic:高性能,一般使用这个(对属性不加锁,多线程下不安全,但速度快)

atomic:低性能,默认(对属性加锁,多线程下线程安全,默认值)


3)set方法处理)内存管理相关参数

retain:对对象release旧值,retain新值(适用于OC对象类型)

assign: 直接赋值(默认,适用于非oc对象类型)

copy:release旧值,copy新值


//

@property(nonatomic,assign)Car *car;

@property(nonatomic,retain)Car *car;


@property(atomic,retain)Car *car;

4)setget方法的名称

修改setget方法的名称,主要用于布尔类型。因为返回布尔类型的方法名一般以is开头,修改名称一般用在布尔类型中的getter

@property(nonatomic,assign,setter=isVip)BOOL vip;

@property(nonatomic,assign,setter=abc:,getter=haha)int age

//注意方法名中的冒号




0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 小红书上买到假货怎么办 主动退市股票钱怎么办 老板卷款逃跑财务怎么办 房开延迟交房怎么办 房开逾期交房怎么办 买了保险想退保怎么办 辐射避难所探索废土死了怎么办 大门上边的齿轮滑丝怎么办 国通石油储油卡怎么办 买大棚房受骗了怎么办 朋友做安利天天来我门面怎么办 安利优惠顾客卡怎么办 苹果手机天气温度不显示怎么办? 安利净水器坏了怎么办 安利净水器滤芯盖搭配坏怎么办 安利会员卡过期了怎么办 婴儿吃了润唇膏怎么办? 用错沐浴露洗头怎么办 雅蜜润肤沐浴露怎么办 自煮小火锅水放少了怎么办 安利皇后锅发黑怎么办 宝宝灌肠后不拉屎怎么办 吃蛋白质粉肚子长胖了怎么办 安利产品过期了怎么办 拼多多拼不到人怎么办 被海南大宗骗了怎么办 手机被游戏扣钱怎么办 做酵素剩下的水果怎么办 喝了酵素胃疼怎么办 海科融通不到账怎么办 美团外卖没生意怎么办 淘宝联盟领券销售怎么办 微信返利被骗了怎么办 众筹失败后资金怎么办 健身房不给退卡怎么办 婆婆陷入民间传销组织怎么办 被三生公司骗了怎么办? ppt保存成了图片怎么办 苹果6速度变慢了怎么办 苹果6s速度很慢怎么办 微信支付上限了怎么办