iOS开发中ARC下的assign和weak区别
来源:互联网 发布:leetcode答案 java 编辑:程序博客网 时间:2024/05/29 17:10
我个人理解就是:weak比assign多了一个功能就是当属性所指向的对象消失的时候(也就是内存引用计数为0)会自动赋值为nil,这样再向weak修饰的属性发送消息就不会导致野指针操作crash。
可能不太好理解下面我写了一个演示程序。
OC:
#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
当程序中的注释被打开时,运行程序有可能会崩溃(有时候不崩溃,你可能需要多运行几次),这是因为当assign指针所指向的内存被释放(释放并不等于抹除,只是引用计数为0),不会自动赋值nil,这样再引用self.assignPoint就会导致野指针操作,如果这个操作发生时内存还没有改变内容,依旧可以输出正确的结果,而如果发生时内存内容被改变了,就会crash。
结论:在ARC模式下编程时,指针变量一定要用weak修饰,只有基本数据类型和结构体需要用assgin,例如delegate,一定要用weak修饰。
看一送一:
《iOS中assign,copy,retain之间的区别以及weak和strong的区别》
• copy: 用于希望保持一份传入值的拷贝,而不是值自身的情况,即把原来的对象完整的赋值到另外一地方,重新加载一内存区,一个地方变了不影响另一个地方的对象。
• assign: 简单的直接赋值,相当于说两个对象指向同个内存区,一个地方的变了,其他的也跟着改变。
• retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数 为1
那上面的是什么意思呢?
Copy 其实是建立了一个相同的对象,而 retain 不是:
比如一个 NSString 对象,地址为 0×1111,内容为@”ABC”
Copy 到另外一个 NSString 之 后,地址为 0×2222,内容相同,新的对象 retain 为 1, 旧 有对象没有变化
retain 到另外一个 NSString 之 后,地址相同(建立一个指针,指针拷贝),内容当然相 同,这个对象的 retain 值+1
assign 地址还是0x1111,内容也还是“ABC”。
也就是说,
1.strong :除NSString\block以外的OC对象
@property(nonatomic,strong) NSArray *<#model#>;
2.weak:各种UI控件(但不是绝对,也有控件要使用strong属性的,但是xib中必须使用weak,因为控件被拖进xib的时候就被strong修饰了)
@property (nonatomic,weak) UIButton *button;
3.assign:CGFloat,NSInteger等基本数据类型、枚举、结构体(非OC对象)
@property(nonatomic,assign) CGFloat <#model#>;
4.copy:
<1. copy : 创建的是不可变副本(如NSString、NSArray、NSDictionary)<2. mutableCopy :创建的是可变副本(如NSMutableString、NSMutableArray、NSMutableDictionary)<3. @property(nonatomic,copy)NSString *<#model#>;
•@property内存管理策略的选择
•1.非ARC
• 1> copy : 只用于NSString\block
• 2> retain : 除NSString\block以外的OC对象
• 3> assign : 基本数据类型、枚举、结构体(非OC对象),当2个对象相互引用,一端用retain,一端用assign
•2.ARC
• 1> copy : 只用于NSString\block
• 2> strong : 除NSString\block以外的OC对象
• 3> weak : 当2个对象相互引用,一端用strong,一端用weak
• 4> assgin : 基本数据类型、枚举、结构体(非OC对象)
- IOS开发中ARC下的assign和weak区别
- iOS开发中ARC下的assign和weak区别
- IOS开发中ARC下的assign和weak区别
- ARC下的assign和weak区别
- iOS开发之ARC下的代理weak VS assign
- 在ARC下 选择使用weak和assign的区别
- iOS中assign和weak的区别
- iOS开发之weak和assign的区别
- iOS中assign和weak修饰符的区别
- iOS中 assign 和 weak 修饰符的区别
- ARC环境下 assign 和 weak 修饰对象时候的区别
- ARC下OC对象使用assign和使用weak的区别
- arc中strong和weak的区别
- weak和assign的区别
- assign和weak的区别
- weak和assign的区别
- weak和assign的区别
- weak和assign的区别
- Android之Color 颜色过度计算
- 第9周项目4 广义表算法库及应用(1)
- Jenkins插件之CIFS
- 数据结构实验之串二:字符串匹配
- (15)迭代器
- iOS开发中ARC下的assign和weak区别
- awk一些高级用法
- linux系统服务添加删除等
- MySQL查看和修改表的存储引擎
- 第十周项目3利用二叉树遍历思想解决问题
- web项目中获取资源及资源路径
- RabbitMQ客户连接池的实现
- Tensorflow API 学习(1)-tf.concat()
- GCD与多线程编程