关于OC修饰词的反思

代码写久了,对于一些基础的东西记忆反而慢慢变得模糊
一些已经习以为常的东西,知道如何去用但是表达不清晰
有时候自己说得清楚,被面试官一绕就要反应一下,
不如自己静下心来总结总结

Objective-C 是OOP(面向对象)的语言
有面向对象就有 类和对象
有类就有属性 (实例变量暂且不提)
而OC的属性(property)是通过用@property定义的公有或私有的方法

例如工程中Appdelegate.h中 系统默认生成
@property (strong, nonatomic) UIWindow *window;

===============
修饰词
上述例子中()内的部分叫修饰词,用于表明对象的属性。

OC中的属性property按照其功能分为以下三种类型:
线程安全:atomic/nonatomic
内存管理:assign/strong/weak/copy
读写权限:readonly/readwrite

Objective-C 中,
基本数据类型 默认关键字是atomic, readwrite, assign;
普通属性(带*的) 默认关键字是atomic, readwrite, strong。

//atomatic nonatomic区别和理解

atomic和nonatomic区别用来决定编译器生成的getter和setter是否为原子操作。
atomic提供多线程安全,是描述该变量是否支持多线程的同步访问,如果选择了atomic 那么就是说,系统会自动的创建lock锁,锁定变量。
nonatomic禁止多线程,变量保护,提高性能。
主要的区别在于多线程操作一个对象时,用nonatomic的话,getter可能会取到只更改了其中一个变量时候的状态,这样取到的东西会有问题,就是不完整的。而atomic可以保证在多线程环境下,解析的访问器提供一个对属性的安全访问,但是性能会比较低。
*如果要保证绝对的线程安全,可通过加锁的方式,例如@synchronized.

//ARC下的内存属性

strong: 表示指向并拥有该对象。其修饰的对象引用计数会增加1。该对象只要引用计数不为0则不会被销毁。当然强行将其设为nil可以销毁它。
weak: 表示指向但不拥有该对象。其修饰的对象引用计数不会增加。无需手动设置,该对象会自行在内存中销毁。
assign: 主要用于修饰基本数据类型,如NSInteger和CGFloat,这些数值主要存在于栈上。表示对属性只进行简单的赋值操作,不更改所赋的新值的引用计数,也不改变旧值的引用计数,常用于标量类型,如NSInteger,NSUInteger,CGFloat,NSTimeInterval等。assign修饰的对象被释放后,指针的地址依然存在,造成野指针,在堆上容易造成崩溃。而栈上的内存系统会自动处理,不会造成野指针。

//MRC下的内存属性

retain:OC对象类型
copy:NSString、Block等类型
assign:非OC对象类型, 基本数据类型
(两个对象相互引用的时候,一端用retain, 一端用assign???。。。此处存疑。。。)

//copy和strong的区别
copy与strong类似。不同之处是strong的复制是多个指针指向同一个地址,而copy的复制每次会在内存中拷贝一份对象,指针指向不同地址。copy一般用在修饰有可变对应类型的不可变对象上,如NSString, NSArray, NSDictionary。

//strong和weak的区别
想起来第一次看书的时候有个例子讲,对象是狗(感觉怪怪的。。),引用就是绳子。强引用就是绳子牵着狗,弱引用就是目光看着狗。有多少强引用就有多少条绳子,所有绳子都脱落,狗才会跑(得到释放),而弱引用没有绳子绑着狗,当这个狗其他的强引用放掉了就跑了,再多目光都没有用,只能得到一个nil。所以,只要最后一个strong型指针不再指向对象,那么对象就会被释放,同时所有的weak型指针都将会被清除。

//UIView应该用strong还是weak修饰
都存在。

使用 sb 或者 xib 给控件拖线的时候,拖出来的线属性都是用 weak 修饰,原因是由于在向 xib 或者 sb 里面添加控件的时候,添加的子视图是添加到了根视图 View 上面, 而 控制器 Controller 对其根视图 View 默认是强引用的,当我们的子控件添加到 view 上面的时候, [self.view addSubView: xxx]这个方法会对添加的控件进行强引用,如果在用 strong 对添加的子控件进行修饰的话,相当于有两条强指针对子控件进行强引用, 为了避免这种情况,所以用 weak 修饰。

在纯手码实现界面布局时,如果通过懒加载处理界面控件,需要使用strong强指针。假如你是弱引用,在removeFromSuperview的时候将自动引用计数-1,等你第二次addSubview的时候,这个view可能已经被释放了,就会造成崩溃。

在ARC中,对象释放的最终根据还是根据引用计数为0时去释放。而weak与strong的根本区别是在set方法中,weak的set方法和strong的set方法都是释放旧值保留新值,但是weak的set方法会对其autorelease,即延迟release一次,而strong的set方法也是释放旧值保留新值,但是其不会延迟release。最终效果是strong会+1,weak不会+1。

//关于copy的深拷贝,浅拷贝,以及相关引用计数
浅拷贝:拷贝地址,仅仅是指向被复制的内存地址,如果原地址中对象被改变了,那么浅复制出来的对象也会相应改变。
深拷贝Deep Copy:在计算机中开辟了一块新的内存地址用于存放复制的对象。

Copy在Objetive-C中的实现方式。如果要调用一个对象的copy方法,这个对象必须遵循NSCopying的协议。这个协议中规定了一个方法:- (id)copyWithZone:(NSZone *)zone;我们就是通过实现这个方法给对象提供拷贝的功能。对于很多现有类,如NSString,NSDictionary...这个方法已经实现。假设我们现在自定义了一个类,需要为这个类提供拷贝的功能,就需要自己来动手写CopyWithZone的方法。

实际使用中区分深拷贝和浅拷贝有个技巧,[string copy]就是浅拷贝,[string mutableCopy]就是深拷贝,前者返回的NSString在runtime下“真身”是__NSCFConstantString,而NSMutableString的“真身”是__NSCFString,然后我们就能很清楚的看到,只要是copy得到的值就是不可变类型,而mutablecopy得到的是可变类型。

总结

可变的用strong修饰,不可变的用copy修饰
假如可变的用copy修饰了,就变不可变了,set的时候会崩溃
假如不可变的用strong修饰了,指针指向的地址值修改了依然会被修改,不安全

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

推荐阅读更多精彩内容