内存管理机制

(一)对象所有权:

1.概念

1.某个函数或者方法有一个指向对象的指针,则称该指针拥有对象。

2.某个对象的成员变量指向另一个对象,如car有一个变量指向engine,则称该对象(car)拥有对象(engine)

2.对象所有权决定了对象的释放与否

1.这谁的啊?没人要我可扔了。(没有拥有者,就应该将其释放)

2.有一天我重构了自己模块内的代码,发现有一个接口没必要使用了,那么可以删掉么?答案是不可以,因为其他人可能在用。(如果某个对象拥有一个或者多 个拥有者,就不能释放)

3.哪些情况会失去对象拥有者?

我是一个模特,我就职于一家模特公司,公司为我的衣柜里准备了许多西装。一天,我穿着一身西装走在了T台上,观众没有尖叫。

于是,

1.one min later,我换了一身西装重新站在了T台上,观众还是没有尖叫。(修改指针变量指向另外一个对象)

2.下台后,我便将此西装扔进了垃圾桶里。(从衣柜collection里删除对象,释放空间)

3.two min later,我脱的精光重新站在了T台上,观众开始疯狂大喊大叫。(设置指针变量为nil)

4.下台后,公司把我开除了(衣服对象的拥有者,也就是我,被公司释放了,衣服失去了一个帅气的拥有者)


(二)强引用和弱引用

我是一名撸啊撸高端玩家,在弗雷尔卓德纵横驰骋好多年了。同时弗雷尔卓德也保存了我的玩家信息。

Server* server = [Server new];

Player* Jiguan = [Player new];


//初始化弗雷尔卓德,它有一个玩家列表

server.serverName = @"弗雷尔卓德";

NSMutableArray* pPlayerArray = [NSMutableArray new];

server.playerArray = pArray;

[server.playerArray addObject:Jiguan];



//我有一个服务器列表,目前我只在弗雷尔卓德玩游戏,我的id是撸遍全服

Jiguan.id = @"撸遍全服";

NSMutableArray* pServerArray = [NSMutableArray new];

Jiguan.serverArray = pServerArray;

[me.serverArray addObject:server];


直到有一天,我觉得这游戏毛意思没有,于是我决定金盆洗手。

但是,我发现麻花疼天天给老子发qq信息,告诉我快来玩游戏啊,弗雷尔卓德需要我。可是老子明明不玩了,真特娘的烦死了。

怎么回事?

原来弗雷尔卓德拥有我的信息,所以我虽然不玩了,但弗雷尔卓德依然有我的传说,导致我的信息根本没销毁,所以麻花疼以为老子还想玩。

这不是老子想要的。

怎么办?

答案:弱引用。


通常情况下,父对象应该使用具有强引用特性的指针,指向子对象,而子对象则应该使用具有弱引用特性的指针,指向父对象。这样可以避免强引用循环问题。同时,具有弱引用特性的指针指向的对象被释放后,指针会自动设置为nil.


(三)属性的特性(多少个人可以同时读写内存)

@property(多线程特性,读写特性,内存管理特性)NSObject* obj;

1.多线程特性:(atomic,nonatomic)

默认是atomic,一般需要写成nonatomic。


2.读写特性:(readonly,readwrite)

默认是readwrire。如果设置为readonly,编译器只会声称存方法。


3.内存管理特性:(strong,weak,copy,unsafe_unretained)

unsafe_unretained是非对象属性(如int value)的默认值,所以value属性不用明确写出类型。

对于oc对象,默认是strong。

1.unsafe_unretained:对于不指向任何对象的属性(如int value),不需要做内存管理,这时应用unsafe_unretained,它表示存取方法会直接为实例变量赋    值。unsafe是相对于弱引用而言的,此类型的指针指向的对象被释放后,指针不会被设置为nil,所以unsafe.

   2.strong:

   3.weak:避免强引用循环

   4.copy:通常情况下,当某个属性是指向其他对象的指针,而且该对象的类有可修改的字类(NSString和NSMutableString或NSArray和            NSMutableArray),应该将该属性的内存管理特性设置为copy。只有可变对象应该设置为copy,而复制不可变对象会浪费内存空间---不可变对象不会    发生上述问题,因为任何对象都无法修改它们。为了避免不必要的复制,向不可变对象发送copy消息时,会返回一个指向自己(仍然是不可变的)指针。

(四)自定义属性的存取方法:如果默认的存取方法无法满足需求,就必须手动覆盖

1.如果在实现文件中编写自定义的存方法,那么编译器就不会再创建默认的存方法,但是仍会创建默认的取方法。

2.如果既覆盖了存方法,也覆盖了取方法(或者为只读属性覆盖了取方法),那么编译器就不会再自动创建响应的实例变量了。如果需要实例变量,必须明确声明。


(五)属性合成:@synthethize

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值