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

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

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

OC:

//

//  ViewController.m

//  weak与assgin的区别

//

//  Created by bihongbo on 15/3/19.

//  Copyright (c) 2015年 毕洪博. 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

当程序中的注释被打开时,运行程序有可能会崩溃(有时候不崩溃,你可能需要多运行几次),这是因为当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 到另外一个 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对象)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 在ARC中的assign和weak可以说非常相像,导致有很多人误以为他们是一摸一样的,在任何时候都可以划等价,但事...
    火星抄手阅读 3,619评论 0 1
  • 大家在用软件时经常会要刷新某个界面,或者是加载更多的数据,随着用户体验的提升在下拉刷新或者上拉加载时都会显示一个动...
    包佳奇阅读 5,803评论 0 9
  • 我终于可以跑十公里了,这感觉真好! 昨天早上跑了10公里,共计用时1小时17分钟;最快一公里速度7分7秒,最慢一公...
    一只蜗牛的马拉松阅读 4,652评论 5 3
  • 好的坏的 回忆太过清晰 会想起你会去看你资料 可是呢 我再也不能找回你 就到这了吧
    9y阅读 1,076评论 0 0

友情链接更多精彩内容