:::info Thread 1: EXC_BAD_ACCESS (code=EXC_I386_GPFLT) ::: image.png

为什么weak修饰的对象调用class方法时不报错?

  • 因为weak修饰的对象销毁后,会自动把isa指针指向null, 向null发送消息不会报错

为什么第一次访问self.assignObject时不报错?第二次访问时报错?

  • 因为第一次调用时候,self.assignObject指向的是obj2,此时对象没销毁,可以正常调用
  • 第二次调用时,对象已销毁,但是self.assignObject没有将指针指向null,此时访问一个已销毁但是未置为null的对象就会报错(鬼知道指向的内存区域存储的是什么东西?)

* -[NSObject retain]: message sent to deallocated instance 0x600002000620**

  1. @interface ViewController ()
  2. @property (nonatomic, weak) NSObject *weakObject;
  3. @property (nonatomic, assign) NSObject *assignObject;
  4. @end
  5. @implementation ViewController
  6. - (void)viewDidLoad {
  7. [super viewDidLoad];
  8. NSObject *obj1 = [NSObject new];
  9. self.weakObject = obj1;
  10. NSLog(@"%@", [self.weakObject class]);
  11. NSObject *obj2 = [NSObject new];
  12. self.assignObject = obj2;
  13. NSLog(@"%@", [self.assignObject class]);
  14. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  15. NSLog(@"%@", [self.weakObject class]);
  16. NSLog(@"%@", self.assignObject);
  17. });
  18. }