ARC下的assign和weak区别

区别

assign和weak虽然都是弱属性修饰符,但是

  • weak修饰的属性指向的对象被释放后,该属性值会自动被赋nil,再次调用该属性时不会崩溃,不会造成野指针。
  • assign修饰的属性指向的对象被释放后,该属性值不会自动赋值nil,此时会造成野指针,如果再次使用该属性,则会发生崩溃。
代码示例
#import "ViewController.h"

@interface ViewController ()

@property (nonatomic, weak) NSObject *weakObject;
@property (nonatomic, assign) NSObject *assignObject;
@property (nonatomic, strong) NSObject *strongObject;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.strongObject = [NSObject new];
    NSLog(@"strongObject: %@", self.strongObject);
    // 输出结果:strongObject: <NSObject: 0x600002c19da0>
    
    self.assignObject = self.strongObject;
    self.weakObject = self.strongObject;
    self.strongObject = nil;
    
    NSLog(@"weakObject: %@", self.weakObject);
    // 输出结果:weakObject: (null)
    
    NSLog(@"assignView: %@", self.assignObject);
    // 此处会崩溃   
}

@end
总结
  • assign更适合于修饰基本数据结构和结构体。
  • weak更适合于修饰对象,但是需要根据具体情况使用。注意,在声明delegate时,避免block循环引用中必须用weak。
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容