What will you do if you weren't afraid ?

iOS的属性关键字修饰符解释weak、assign、atomic和nonatomic等

    iOS     iOS修饰符,weak,assign

weak

  • 只能修饰派生自NSObject类或协议,因为NSObject即是类,也是协议
  • 在对象的引用计数器为0时,对象的指针自动指向nil
  • 可以解决循环引用问题

assign

  • 可以修饰基础数据类型,也可以修饰派生自NSObject类的对象
  • 在对象的引用计数器为0时,对象的指针不会自动指向nil
  • 可以解决循环引用问题

atomic

  • 是Objective-C默认修饰的
  • 原子性的
  • 之所以线程安全,是因为只能编译器在生成settergetter时,方法内部会有一个@synchronized()的同步互斥锁
  • 线程不安全,是因为在多线程中操作对象时,比如:NSArrayaddObject:方法,它是没有锁的,所以为了保证安全,我们必须自己加锁
  • 速度慢

nonatomic

  • 不是Objective-C默认修饰的,需要手动添加
  • 非原子性
  • 线程不安全
  • 速度快

strong

  • Objective-C对象默认创建时,就是强引用
  • 修饰Objective-C对象的,创建时为引用计数为1
  • 不管是修饰可变属性还是不可变属性,只要使用了赋值号,就是增加了一个指针指向同一块内存地址

copy

  • 修饰不可变属性时,是浅拷贝,意思是:只要使用了赋值号,就是增加了一个指针指向同一块内存地址
  • 修饰可变属性时,是深拷贝,意思是:只要使用了赋值号,就是新开辟了一块内存空间

__block

  • 默认情况下,局部变量只可以被block访问
  • 但是用它来修饰局部变量,就可以在block代码块里修改局部变量的值,因为这个局部变量被拷贝了一份到block代码块里,如果是指针就是拷贝了一份指针

__weak

  • 就是将OC的对象改变成弱引用指针

注意
一个block代码块是否会造成循环引用要看这个block所属的类是对这个block什么修饰,如果是strongcopy,则这个block代码块一定是强引用,且在外部使用这个block代码块时,使用self,就一定要转换成__weak形式;或者在这个block所属的类里对这个block修饰为assign或者weak,则在外部使用这个block代码块时,self不用转换为__weak形式。

page PV:  ・  site PV:  ・  site UV: