ios开发中ARC下的assign和weak区别

本文探讨了在ARC环境下,assign和weak关键字在使用上的差异,特别是对于delegate属性的设置。作者指出,尽管两者相似,但weak在对象释放后会自动设为nil,避免野指针问题,而assign则不会。通过示例代码,展示了当使用assign时可能出现的崩溃情况,强调在编程中应当根据对象类型选择合适的修饰符,delegate通常应使用weak。
摘要由CSDN通过智能技术生成

在ARC中的assign和weak可以说非常相像,导致有很多人误以为他们是一摸一样的,在任何时候都可以划等价,但事实却不是这样。

id类型的delegate属性到底是用assign还是weak

 

@property (weak, nonatomic) id<AnyDelegate> delegate;
@property (assign, nonatomic) id<AnyDelegate> delegate;

大家众说纷纭,说都可以的,说assign的,说weak的都有,下面我们来看一本书中的描述:

“The main difference between weak and assign is that the with weak, once the object being pointed to is no longer valid, the pointer is nilled out. Assigning the pointer the value nil avoids many crashes as messages sent to nil are essentially no-ops”
Excerpt From: Daniel H Steinberg.
“Developing iOS 7 Apps for iPad and iPhone.” Dim Sum Thinking, Inc, 2014. iBooks. iTunes - Books

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

可能不太好理解下面我写了一个演示程序。

 

#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修饰。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值