属性的关键字和内存管理

@property

@property是在声明属性时快速创建getter、setter存取器,并通过一些修饰符来控制线程安全(atomic、nonatomic)、访问权限(readwrite、readonly)、ARC内存管理(assign、strong、weak、copy、unsafe_unretained)、MRC内存管理(assign、retain、copy)、指定存取方法名(setter = 、getter = )等。

注:@synthesize是在.m中,生成@property定义的属性的setter、getter的实现,如今都由系统默认实现getter、setter,无需手动添加@synthesize。

@property还默认生成了_obj的实例变量,self.obj实际上默认调用了set、get方法,而_obj是直接访问了实例变量。

@synthesize obj = _obj(别名,或者说是定向到属性的实例变量名,可以是任意名称),当在同时重写getter、setter方法的时候,系统不会添加_obj实例变量名,所以要手动添加别名用于setter和getter中。

atomic(默认)和nonatomic

atomic属于原子操作,当前存取器上线程安全,比较耗费系统资源,可防止多线程同时访问写入造成的数据错误。nonatomic相反。

readwrite(默认)和readonly

readonly只生成getter没有setter。为了属性值更便于理解可自定义存取访问器名称:

@property (nonatomic, setter = mySetter:, getter = myGetter) NSString *name;

assign(默认)

多用于非指针变量的基本数据类型(NSInteger)以及C数据类型和id。MRC模式中修饰delegate等指针变量。

注:在ARC模式中,用assign关键字修饰指针变量,对象被回收会造成野指针

而在MRC模式中,因为没有weak的出现所以只能用assgin修饰delegate、IBOutlet这类特殊对象,手动将对象 = nil可避免野指针的情况。

strong(ARC)

强引用,指向同一块内存地址,引用计数+1。属于浅拷贝(指针拷贝)用于代替MRC中的retain关键字,但自行管理引用计数。

weak(ARC)

弱引用,对传入的对象不持有,即不增加传入对象的引用计数,所以传入对象释放时,weak声明的变量指向nil,为了避免野指针,也被置为nil。

多用于delegate、IBOutlet等声明,是避免野指针进阶版的assign。

self.model = [[Model alloc] init]; //self.model强引用Model

self.model.delegate = self; //model.delegate弱引用self

copy(ARC)

在声明非可变对象时,copy和strong在内容和内存管理上是没有区别的,都只做了浅拷贝,与传入对象指向同一块内存地址。

但对于可变对象(NSMutableString、NSMutableArray等),copy声明的对象做了一下深拷贝产生了新对象,并且由于底层是调用了[obj copy]方法,可变对象都转换成了不可变类型(NSMutableString→NSString)。

copy关键字主要是为了:避免对可变的源数据对象造成污染。

unsafe_unretained(ARC)

unsafe_unretained关键字事实上是iOS5以后的ARC时代为了向下兼容(因为iOS5以前没有weak属性)而存在的。但在我的理解中,它应该是等价于assign关键字。

retain(MRC)

等同于ARC时代的strong,都是增加引用计数的强引用对象,不能用来修饰基础数据类型。


MRC和ARC

MRC

MRC(Mannul Reference Counting)内存管理模式下,我们使用retain、release、autorelease等方法对变量进行手动内存管理。

Number *num = [[Number alloc] init];   //num指向了[[Number alloc] init]初始化后的内存,这块内存的引用计数为1

Number *num2 = [num retain];   //num2通过num指针retain又增加了这块内存的引用计数,现在为2

[num2 release];    //释放num2指针对内存的所有权,引用计数-1,现在为1

[num release];  //释放num指针对内存的所有权,引用计数-1,现在为0,和num2的释放顺序无关紧要,此时这块内存被释放,num和num2都变成野指针

注:引用计数是针对[[Number alloc] init]这块内存的,num、num2等都是指向这块内存的指针而已,每个指向这块内存的指针都会使这块内存的引用计数+1。

[num autorelease]; //放入自动释放池,稍后某个时刻(每个runloop执行完成后)释放。

@autoreleasepool

自动释放池,除直接release外的另一种管理内存释放的方式。

ARC时代,系统自行管理释放池,对象无法调用autorelease,但可使用autoreleasepool,每次事件循环(RunLoop)结束后(通俗的可理解为花括号的结束),autoreleasepool就会回收池中的内存。autoreleasepool排布在栈中,对象受到autorelease消息后,系统将其放入栈顶的池里,由系统自动释放。

需要手动创建autoreleasepool的情况:

1、main():main()函数的末尾是应用程序的终止,当你在main()中加入其它代码时,手写的这个autoreleasepool实际上是为默认的自动释放池无法容纳的对象,提供一个最外围的自动释放池。

2、当你的循环中创建了许多临时对象时,应加入autoreleasepool避免内存爆发式增长。

for(inti =0; i <10000; i++) {

    NSString*str =@"test";  //不加autoreleasepool,对象在for循环结束前会不断创建,占用大量内存

    @autoreleasepool{

         NSString*str =@"test";  //手写的自动释放池会在单次循环结束后就回收临时对象

         arr.add(str)

     }

}

ARC

ARC(Automatic Reference Counting),自动引用计数,即在编译过程中自动加入了MRC模式下的retain、release。

与MRC模式混编:在文件的flags中添加-fno-objc-arc / -fobjc-arc,

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

推荐阅读更多精彩内容

  • 内存管理 简述OC中内存管理机制。与retain配对使用的方法是dealloc还是release,为什么?需要与a...
    丶逐渐阅读 1,958评论 1 16
  • iOS内存管理 概述 什么是内存管理 应用程序内存管理是在程序运行时分配内存(比如创建一个对象,会增加内存占用)与...
    蚊香酱阅读 5,707评论 8 119
  • 29.理解引用计数 Objective-C语言使用引用计数来管理内存,也就是说,每个对象都有个可以递增或递减的计数...
    Code_Ninja阅读 1,477评论 1 3
  • 内存管理的原理? 内存空间总共有8块区域,有两个区域需要特别注意,一个就是堆空间,一个就是栈空间。栈里存放临时变量...
    Carden阅读 456评论 0 1
  • 画画第十七天,彩铅水果画第三天,昨儿晚上追《人民的名义》,大爱陈海,掉了不少眼泪。今天只能半大夜抽时间坚持画画打卡...
    花芊猪儿阅读 314评论 2 1