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对象)

0 0
原创粉丝点击