selector

@property中的关键字:weak,assign,atomi

2020-10-05  本文已影响0人  CyberDunk1997

@property中的关键字:https://www.jianshu.com/p/3709cf8f8937
成员变量和属性的区别:https://www.jianshu.com/p/16692335eb41

1. @property做了些什么?

当我们写下property NSObject *foo;时,编译器为我们做了三件事

@property的本质是什么?

@property = ivar(实例变量) + getter(get方法) + setter(set方法);

也就是说使用@property 系统会自动生成setter和getter方法;

2. atomic和nonatomic

举例:

如果线程 A 调了 getter,与此同时线程 B 、线程 C 都调了 setter——那最后线程 A get 到的值,有3种 可能:可能是 B、C set 之前原始的值,也可能是 B set 的值,也可能是 C set 的值。同时,最终这个属性 的值,可能是 B set 的值,也有可能是 C set 的值。所以atomic可并不能保证对象的线程安全。

总结:

atomic
nonatomic

3.assign

4. weak

weak的原理

weak的实现步骤

NSObject *obj = [[NSObject alloc] init];
id __weak obj1 = obj;

当weak修饰的对象被释放时,weak指针的处理流程

  1. 调用objc_release
  2. 因为对象的引用计数为0,所以执行dealloc
  3. 在dealloc中,调用了 _objc_rootDealloc函数 -> 调用了object_dispose函数 -> 调用objc_destructInstance -> 最后调用objc_clear_deallocating
  4. objc _ clear _ deallocating该函数的动作如下:
    1. 从weak表中获取废弃对象的地址为键值的记录
    2. 将包含在记录中的所有附有 weak修饰符变量的地址,赋值为nil
    3. 将weak表中该记录删除
    4. 从引用计数表中删除废弃对象的地址为键值的记录

5. copy

小结iOS中的copy:https://www.jianshu.com/p/5254f1277dba

预备知识

copy的作用

上一篇下一篇

猜你喜欢

热点阅读