美文网首页
ARC下的assign和weak区别

ARC下的assign和weak区别

作者: 芮小妹儿很闲 | 来源:发表于2019-06-11 15:14 被阅读0次
    区别

    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。

    相关文章

      网友评论

          本文标题:ARC下的assign和weak区别

          本文链接:https://www.haomeiwen.com/subject/djbffctx.html