[iOS] 一.属性修饰符吐槽

一.写在前面的话

为什么要把他排在第一位?这是有原因的,因为这破玩意在开发中很少会引起注意,一般人都是一带而过,不去深究那些细节.

在这里我要给一直在开发路上奔波的新手们说一句公道话

这里东西,即使不去深究一般的开发也不会出现问题,因为一个小小的属性修饰符就否定一个人,我觉得这已经不是草率的问题了,而是你内心的狭隘.

好了接下来我们进入正题,属性修饰符嘛,顾名思义就是修饰属性的,而属性是什么呢?很简单,我就用我自己的理解,就是个全局变量,在程序每个地方都可以使用到,那么与成员变量的区别是什么呢?除了充当一个成员变量以外,就是自动生成了一个setter方法和一个getter方法,使程序员们方便使用了。

二.属性修饰符

属性修饰符都有哪些呢:

  • strong/retain

  • assign/weak

  • copy

  • atomic/noatomic

  • readwrite/readonly

strong/retain:

strong是ARC下新引入的属性修饰符但它在MRC下仍然可以使用,你可以把它当成MRC中的retain,用它修饰就是强引对象,retainCount会加1

假设有一个属性

@property (nonatomic, strong) NSString *name;

在ARC下,这时它的setter方法应该这样

- (void)setName:(NSString *)name {
        _name = name;
}

而MRC下的retain的setter方法是这样

- (void)setName:(NSString *)name {
    //如果地址不一样,证明_name与name是不同的值
    if (_name != name) {
        //这时我们先把旧值释放 防止内存泄露
        [_name release];
        //然后把新值强引用(retainCount+1)赋值于成员变量上
        _name = [name retain];
    }
}

assign/weak:

assign:

首先讲一下assign这个东西是专门用来修饰基本数据类型,在iOS开发中什么是基本数据类型呢?通俗的讲就是非对象类型,比如int、float、double、NSInteger,这种数字类型就称为基本数据类型,他们都不是对象,但是万事没有那么绝对的,它也可以修饰对象,但是那么做是十分不安全的,那么为什么这个修饰符不能修饰对象呢?那是因为assign是弱引用,如果用它修饰对象,那么对象一旦创建就会立即被释放,然而assign依然会保留对象的指针,但是对象已经消失了,所以该指针指向了一块被释放的内存区域,即为野指针,当野指针调用对象方法的时候(向对象发送消息),就会发生崩溃。

weak:

weak与assign一样是弱引用,但是weak是用来修饰对象的,苹果规定不能用它修饰基本数据类型,如果修饰立即就会报错

weak修饰基本数据类型报错

上面说了weak也是弱引用,为什么苹果会允许它修饰对象呢,因为weak上面添加了一个安全机制,如果weak所引用的对象被释放了,就会把weak上的指针设置为nil,这样当对象再执行方法的时候,就不会发生崩溃了,因为即使对象被释放了,向nil发送消息也不会造成崩溃,所以使用weak修饰对象是安全的。

有些人可能不理解为什么要使用weak在这里我给你们抛一块砖

设想有这样一种情况,当一个子视图由于某种原因要将它的父控制器作为自己的属性,以便于在子视图的各个角落都可以调用调用到父控制器的方法,这时如果你使用strong来修饰这个父控制器就会出现子视图强引用父控制器导致父控制器无法被释放的问题,这就是所谓的内存泄漏,所以这里需要使用weak来修饰它的父控制器,由于weak是弱引用,不会让父控制器引用计数增加,这样就既不会造成内存泄漏,又可以优雅的使用父控制器对象了。

copy:

这个东西往浅了说就是复制, 往深了说需要说好几大篇章, 其实就是在对象进行setter方法时先对对象做复制操作, 而对可变变量和不可变变量的复制是不一样的, 这里总结一下, 对不可变变量的复制都是拷贝指针, 也就是常说的浅拷贝, 而对可变变量的copy会复制出一个一模一样的克隆人放在另一块内存地址中, 只不过该变量从此不可变, 说到这里可能有人对mutableCopy有疑问, 这个东西不是属性修饰符, 所以我就顺便告诉你一下, 就一句话

只有不可变对象进行copy才是浅拷贝, 其他都是深拷贝

下面写一下copy的setter方法

ARC下

- (void)setName:(NSString *)name {
    _name = [name copy];
}

MRC下

- (void)setName:(NSString *)name {
    //如果地址不一样,证明_name与name是不同的值
    if (_name != name) {
        //这时我们先把旧值释放
        [_name release];
        //然后把新值强引用(retainCount+1)赋值于成员变量
        _name = [name copy];
    }
}

atomic/noatomic

这两个东西我自己也不是特别清楚, 毕竟还是很年轻, 但是你记住atomic是原子性, 使用这个修饰符可以保证线程安全但是会降低效率, 而noatomic是非原子性, 不会保证线程安全, 但效率比atomic高, 我们开发中一般都是用noatomic.

readwrite/readonly:

先挑简单的说readwrite就是可读写,不加这个属性修饰符默认就是如此,所有变量都是可以读写的,也就是都自带setter和getter方法,而使用readonly修饰系统会自动生成getter方法而不生成setter方法所以是只读的,无法赋值。

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

推荐阅读更多精彩内容