iOS开发基础:property修饰词

修饰词:assign、weak、strong、retain、copy、nonatomic、atomic、readonly、readwrite


assign(ARC、MRC)
  1. 修饰整型等基本数据类型,直接赋值的意思。
  2. 如果没有weak、strong、retain、copy修饰,默认使用assign。
  3. 对象也可以用assign修饰,只是引用计数不会+1(与strong的区别)
  4. 如果用来修饰对象属性,对象销毁后是不会指向nil的,就会产生野指针错误。(与weak的区别)

weak(ARC)(对象)

  1. 针对对象的修饰词,不能修饰基本数据类型(int float)
  2. weak修饰的引用计数不会+1,也是直接赋值
  3. 弱引用是为了打破循环引用而产生的。
  4. 指针指向的对象如果被销毁,指针会指向nil,不会产生野指针错误。

在block中,block在copy的时候,会对内部使用到的对象引用计数+1,,如果使用[self 方法名],那么就会有一个强指针指向self所在的class的内存地址,class的引用计数+1,这样导致class所在的内存地址无法被释放,造成内存泄露

assign和weak区别:weak比assign多了一个功能。就是当属性所指向的对象消失的时候(也就是内存引用计数为0)会自动赋值为nil,这样再向weak修饰的属性发送消息就不会导致野指针操作crash。
举个例子:

//
//  ViewController.m
//  weak与assgin的区别
//
//  Created by 王海玉 on 2017/10/14.
//  Copyright © 2017年 王海玉. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()

@property (nonatomic,weak) id      weakPoint;

@property (nonatomic,assign) id    assignPoint;

@property (nonatomic,strong) id    strongPoint;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.strongPoint = [NSDate date];
    NSLog(@"strong属性:%@",self.strongPoint);

    self.weakPoint = self.strongPoint;
    self.assignPoint = self.strongPoint;
    self.strongPoint = nil;

    NSLog(@"weak属性:%@",self.weakPoint);
    //    NSLog(@"assign属性:%@",self.assignPoint)
}

@end

当注释打开时,程序就有可能会崩溃。(需要多运行几次)


retain ( MRC )

  1. release 旧对象( 旧对象计数器 -1 ) , retain 新对象( 新对象计数器 +1 ) , 然后指向新对象 .
  2. 在set方法里面是这样的 :
if(_dog!=nil) { 
  [_dog release];  
}
_dog= [dog retain];

strong ( ARC )(对象)

  1. 直接赋值并且对象的引用计数器 +1 .
  2. 在 ARC 里替代了 retain 的作用 .
  3. 直接指向该指针

copy ( ARC/MRC )

  1. copy 在 MRC 时是这样做的 release 旧对象( 旧对象的引用计数器 -1 ) , copy 新对象( 新对象的引用计数器 +1 ) , 然后指向新对象 .(新对象是指最终指向的那个对象,不管深拷贝还是浅拷贝)
  2. copy 在 ARC 时是这么干的 copy 新对象( 新对象的引用计数器 +1 ) , 然后指向新对象 .
    copy和mutableCopy区别
    举例:
    NSString *test1 =@"123456";
   // NSArray *array1 =[NSArray arrayWithObjects:@"123",@"123",@"123",nil];
    NSString *test2 =[test1 copy];
    NSString *test3 =[test1 mutableCopy];
    NSMutableString *test4 =[test1 copy];
    NSMutableString *test5 =[test1 mutableCopy];
    //test1 = @"asda";
    NSLog(@"地址1 %d 地址2 %d",test1,test2);
    NSLog(@"地址1 %d 地址2 %d",test1,test3);
    NSLog(@"地址1 %d 地址2 %d",test1,test4);
    NSLog(@"地址1 %d 地址2 %d",test1,test5);
运行结果
    NSString *test1 =@"123456";
    NSArray *test2 =[array1 copy];
    NSArray *test3 =[array1 mutableCopy];
    NSMutableArray *test4 =[array1 copy];
    NSMutableArray *test5 =[array1 mutableCopy];
    NSLog(@"地址1 %d 地址2 %d",array1,test2);
    NSLog(@"地址1 %d 地址2 %d",array1,test3);
    NSLog(@"地址1 %d 地址2 %d",array1,test4);
    NSLog(@"地址1 %d 地址2 %d",array1,test5);
运行结果

那么看来对NSString 和 NSArray来讲 copy都是浅copy,NSMutableCopy则是深度copy;

那么如果被copy的对象是可变的呢?

NSString *test1 = [NSMutableString stringWithFormat:@"123"];
//将第一行代码改成如下;
运行结果

则可以产生一个一样的结论,copy对可变字符串是深拷贝,而NSMutableCopy则对所有都是深度copy。

strong copy mutableCopy 区别

image.png

nonatomic ( ARC/MRC )

  1. 不对set方法加同步锁 .
  2. 性能好
  3. 线程不安全

非多线程时用效率高。


atomic ( ARC/MRC )

1.原子属性就是对生成的 set 方法加互斥@synchronized(锁对象) .

 @synchronized(self) { _delegate = delegate;}

2.需要消耗系统资源 .
3.互斥锁是利用线程同步实现的 , 意在保证同一时间只有一个线程调用 set 方法 .
4.其实还有 get 方法 , 要是同时 set 和 get 一起调用还是会有问题的 . 所以即使用了 atomic 修饰 还是不够安全 .

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

推荐阅读更多精彩内容

  • 很多人讲属性修饰词的时候,喜欢从字面或者定义的角度介绍它们间的区别。这篇文章,我们侧重从修饰词对setter方法的...
    小码僧阅读 3,326评论 1 18
  • 搜罗世间美味,感知幸福瞬间! 民以食为天!而我,俨然是一个名副其实的“吃货”! 现在有许多明星,喜欢给自己一个“吃...
    十八加一阅读 407评论 0 4
  • 情感空洞的时候,感觉自己是个单一的人。我一直以为,心里充满期待和美好的愿望,可以实现理想。可惜,缺乏行动,一切都是...
    芥末小胖阅读 339评论 0 0
  • 转眼便是十五个秋,孩子为我纯情而写,感念之,转记以悦己愉人! 豆文选记(1) .....................
    落筆轩阅读 371评论 0 2
  • 文档原则:文档足够清楚和准确 只需包括设计或者开发过程中可能混淆的功能定义,只需记录在创建这个产品时已经确定下来的...
    逝也阅读 280评论 0 0