内存管理机制

retain : release旧值 , retain新值。

assign : 直接赋值

copy :release旧值 , copy 新值。 

release旧值 , retain新值其实就是在set方法里面实现如下代码

- (void)setCar:(Car *)car{

    if ( car != _car )

    {

        [_car release];

        _car = [car retain];

    }

}



OC使用了一种叫做引用计数的机制来管理对象

引用计数(reference counting)又称为保留计数(retaincounting),引用计数的数值表示有几个其它对象在使用它。

retain(MRC)

retain创建新对象(新对象引用计数+1),然后指向新对象。

retain用法为先判断此新对象是否存在,如果存在先release,然后retain。如果不存在直接retain。

一般用于指针对象,例如数组对象(NSMutableArray,NSArray),字典对象,视图对象(UIView),控制器对象(UIViewController)等这些需要保持引用计数的属性。

assign(ARC、MRC)

不复制,不保留就是直接赋值的意思。常修饰基本数据类型(int,float)、枚举、结构体。如果没有使用weak,strong,retain,copy修饰,那么默认就要使用assign修饰(不能共存)。对象也可以使用assign修饰,但修饰对象的引用计数不会+1(与strong的区别再此)。如果用来修饰对象的属性,那么当前所修饰的对象被销毁后指针不会指向nil的。所以会出现野指针错误(与weak区别再此)。

copy(ARC、MRC)

在MRC中,先release旧对象(旧对象引用计数-1),再copy新对象(新对象引用计数+1),指向新对象(这样做是为了减少上下文的依赖而引入的一种机制)。新对象是指最终指向的那个对象(包含深拷贝、浅拷贝)。

在ARC中,直接copy新对象,新对象引用计数+1,然后指向新对象。

注意:copy修饰的对象,本身是不可变的。否则添加元素表面上可以,但运行时会奔溃。

release(MRC)

旧对象,旧对象引用计数-1

autorelease(MRC)

自动释放池(Autorelease pool),是能够自动释放赤忠的对象的。NSObject类提供了一个autorelease消息,当我们想一个对象发送autorelease消息的时候,这个对象就会随着释放池的销毁而释放。

自动释放池是以栈的形式实现的,当某个对象调用了autorelease方法时,该对象会被加入自动释放池的栈顶。对于发送了autorelease消息的对象,当自动释放池销毁时,自动释放池会对这些对象发送一条release消息,来释放他们。autorelease只不过意味着预定延迟发送一条release信息,当前的引用计数并没有变。

atomic(ARC、MRC)

原子属性就是生成的set方法互斥锁@synchronize(锁对象),需要消耗系统资源。

互斥锁是利用线程同步实现的,意在保证同一时间只有一个线程调用set方法。只针对set方法,同时也有get方法。

nonatomic(ARC、MRC)

不对set方法加锁,性能好,线程不安全。

readonly(只读)(ARC、MRC)

让Xcode只生成get方法,不想把暴露的属性被人随便替换时,可以使用。

readwrite(可读可写,默认属性)(ARC、MRC)

让Xcode生成get/set方法,不用readonly修饰时,默认就是readwrite修饰。

strong(ARC、强引用)

指针修饰会保存对象的生命,某些情况下你仍然需要手动设置这些指针为nil,否则可能会导致内存不足。无论何时你创建一个新对象时,都需要考虑谁拥有该对象,以及这个对象需要存活多久(ARC之后引入strong代替了retain)。常修饰OC对象,默认修饰符也是strong,引用计数+1。

weak(ARC、弱引用)

指针变量仍然可以指向一个对象,但不属于对象的拥有者。weak型的指针变量自动变为nil是非常方便的,这样阻止了week指针继续指向已释放对象,避免了野指针的产生,不然会导致非常难于寻找的Bug,空指针消除了类似的问题。常修饰代理/UI控件,不能修饰基本数据类型:因为weak是弱指针,弱指针是针对对象的修饰词.weak修饰引用计数不会+1,也就是直接赋值,弱引用是打破循环引用而产生的。

ARC机制的使用规则

1)、不能调用dealloc,不能重写和调用retain,release,retainCount 和autorelease。dealloc虽然能够重写,但是不能调用[super dealloc]之类的方法。

2)、不能使用NSAllocateObjec或NSDeallocateObject函数来创建对象。

3)、不能在C语言的结构体中使用对象指针,同时建议用object-c的类来管理数据而不是结构体。

4)、不得使用NSAutoreleasePool对象。ARC中,全部使用@autorelease关键字代替,且比NSAutoreleasePool更高效。

5)、不得使用内存Zone,那些牵涉NSZone的方法都不得使用。

6)、不得对一个属性变量的取值方法命名以new开头。

7)、outlet均用weak关键字修饰,除非他是xib中最顶部的界面元素,则需要strong。

8)、CoreFoundation不适合ARC,该创建的仍创建,该释放的仍释放。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,254评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,875评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,682评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,896评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,015评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,152评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,208评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,962评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,388评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,700评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,867评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,551评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,186评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,901评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,689评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,757评论 2 351

推荐阅读更多精彩内容