美文网首页
你所不知道的Strong、Copy、assign、Weak

你所不知道的Strong、Copy、assign、Weak

作者: iOS界的五五开 | 来源:发表于2018-07-03 17:31 被阅读14次

    在开发过程中最常见的@property 属性、最近经常用到的莫过于strong、copy、assign、weak。但是你真的了解它们为什么使用的情况吗?不要等到面试被问到不会的时候才来看。

    assign

    第一反应、就是用来修饰数据类型、什么int、float等等等。但是你有没有想过如果assign用来修饰其他的呢、比如Button 或者说别的对象。答案是可以修饰对象。但是被assign修饰的对象在释放后,指针的内存地址还是存在的,也就是说指针的地址没有被设置为nil、成为了野指针。如果后续再分配对象到堆上的某块内存的话,正好分配到这块内存地址,就会carsh了。之所以可以修饰基本数据类型,是因为数据类型的内存一般被分配到栈上,栈的内存系统会自动处理,不会出现野指针。

    weak

    修饰object对象、修饰的对象在释放后、指针地址会设置为nil、是一种弱引用。在ARC环境下,往往会把delegate 属性用weak来修饰。weak和strong不同:当一个对象不再有strong类型的指针指向它的时候,它就会被释放,即使还有weak型指针指向它,那么这些weak型指针也将被清除。(其实没有这么简单、应该说weak 本身是一个hash表。key是对象地址、会有对应的value :指针地址 后续有需要的话会单独讲解)

    copy

    会在内存里拷贝一份对象,两个指针指向不同的内存地址。一般用来修饰NSString等有对应可变类型的对象,因为他们有可能和对应的可变类型(NSMutableString)之间进行赋值操作,为确保对象中的字符串不被修改 ,应该在设置属性是拷贝一份。而若用strong修饰,如果对象在外部被修改了,会影响到属性。

    补充

    block属性为什么需要用copy来修饰?

    因为在MRC下,block在创建的时候,它的内存是分配在栈(stack)上的,而不是在堆(heap)上,可能被随时回收。他本身的作于域是属于创建时候的作用域,一旦在创建时候的作用域外面调用block将导致程序崩溃。通过copy可以把block拷贝(copy)到堆,保证block的声明域外使用。在ARC下写不写都行,编译器会自动对block进行copy操作。

    这个面试真的会动不动就问到、看似非常简单。

    相关文章

      网友评论

          本文标题:你所不知道的Strong、Copy、assign、Weak

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