iOS中property的关键字(史上最详解)

昨天立了flag,今天就来开始第一篇文章吧。
property的关键字是我们平常写代码随时都会用到的,只要声明一个属性,就会用到这些关键字,先从最简单的讲起吧。

一、如何使用

property的关键字分三类:

  • 一类是表示原子性(也就是线程安全)的,有atomic和nonatomic,默认是atomic,acomic也就是线程安全,但是我们一般都用的nonatomic,因为atomic的线程安全开销太大,影响性能,即使需要保证线程安全,我们也可以通过自己的代码控制,而不用atomic。
  • 一类是表示引用计数的,有assign(iOS5以前用unsafe_unretained),strong,weak,copy。
    assign: assign用于非指针变量,一般用于基础类型和C数据类型,这些类型不是对象,统一由系统栈进行内存管理。
    weak:对对象的弱引用,不增加对象的引用计数,也不持有对象,当对象消失后指针自动指向nil,所以这里也就防止了野指针的存在。
    strong:对对象的强引用,会增加对象的引用计数,如果指向了一个空对象,会造成野指针,平常我们用得最多的应该也是strong了。
    copy:建立一个引用计数为1的新对象,赋值时对传入值进行一份拷贝,所以使用copy关键字的时候,你将一个对象复制给该属性,该属性并不会持有那个对象,而是会创建一个新对象,并将那个对象的值拷贝给它。而使用copy关键字的对象必须要实现NSCopying协议。
    unsafe_unretained:跟 weak 类似,声明一个弱引用,但是当引用计数为 0 时,变量不会自动设置为 nil,现在基本都用weak了。
  • 一类是表示读写权限的,默认是readwrite(可读可写),还有就是readonly,当你希望暴露出来的属性不能被外界修改时就需要申明为readonly。

二、关键字与内存管理

这里重点讲一下与内存管理相关的这几个关键字。
直接上代码吧

测试

@property (nonatomic,strong) Person *strongPerson;
@property (nonatomic,weak) Person *weakPerson;

试验代码

self.strongPerson = [Person new];
self.weakPerson = self.strongPerson;
self.strongPerson = nil; NSLog(@"strongStr=%@,weakStr=%@",self.strongPerson,self.weakPerson);

输出结果为:
strongStr=(null),weakStr=(null)
这里就足以说明weak修饰的属性并不会使引用计数增加

稍微修改代码,把weakPerson设置为nil

self.strongPerson = [Person new];
self.weakPerson = self.strongPerson;
self.weakPerson = nil;
NSLog(@"strongStr=%@,weakStr=%@",self.strongPerson,self.weakPerson);

输出结果如下:
strongStr=<Person: 0x600000007d50>,weakStr=(null)
说明weak修饰的属性只是对对象的弱引用,并不会真正的持有该对象。
再次修改代码

    Person *p = [Person new];
    self.strongPerson = p;
    self.weakPerson = self.strongPerson;
    p = nil;
    NSLog(@"strongStr=%@,weakStr=%@",self.strongPerson,self.weakPerson);

输出结果为:
strongStr=<Person: 0x600000200b50>,weakStr=<Person: 0x600000200b50>
这里不用多说,因为strong属性会强引用该对象并使该对象的引用计数+1,所以即使把p设置为nil,该对象也并没有释放,要想释放该对象,还得把strongStr设置为nil。
self.strongPerson = nil;
这样输出结果就是 strongStr=(null),weakStr=(null)了。

再来看看copy关键字
为了方便试验,我们直接在ViewController里面加个属性。
@property (nonatomic, copy) NSObject *c;

    NSObject *a = [[NSObject alloc]init];
    self.c = a;
    a = nil;
    NSLog(@"%@",self.c);

毫无疑问,输出结果不为nil。

    <NSObject: 0x600000010d90>

在这里要重点说一下,使用NSMutableArray,NSMutableDictionary等可变集合对象的时候千万不要用copy,这里用copy 99%会出错,因为当你给该属性赋值时它会自动调用对象的copy方法,从而将可变集合转换成不可变集合,把一个不可变集合赋值给一个可变集合,就会造成错误。

感觉写得有些啰嗦,我觉得主要是给新人看吧,毕竟我自己当初一直对这些关键字也是懵懵懂懂的,如果看了我这篇文章还是不能理解,那应该是完全不了解内存管理方面的知识,MRC、ARC应该去了解一下,如果后面有需要,我可能会写一篇相关的文章。

另外,还请大神门多多指教。。。。

更新

之前是用NSString来做的实验,但是由于字符串的特殊性,所以有点容易误导大家,现在已经全部改成了普通类了。关于字符串类型,主要是苹果在编译期做了一些优化,让它的特性跟普通变量有点类似,在这里就不说太多了,以免给大家造成困惑。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念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

推荐阅读更多精彩内容

  • 原文链接http://www.cnblogs.com/kenshincui/p/4186022.html 音频在i...
    Hyman0819阅读 21,540评论 4 74
  • 虚伪的反抗者 战铠底下是睡袍 以为黑暗是现实 以为光明愚妄 诋毁弱者说漂亮话 说漂亮话以慰己
    PoorJoy阅读 169评论 0 1
  • 神秀说:“身是菩提树,心如明镜台,时时勤拂拭,勿使惹尘埃。” 慧能说:“菩提本无树,明镜亦非台,本来无一物,何处惹...
    TT平常心阅读 556评论 0 1
  • 因为驾照的事,我不得不去进行路面教育,也就是去马路上站岗。从七点开始,穿着引人注目的小马甲,戴着小红帽,手里还有拿...
    小女不小阅读 290评论 0 1