iOS 永不再错的assign,retain,copy的区别
2017-04-18 本文已影响0人
风鹰lm
本文是本人多次面试跟面试官交流加上自己使用经验的心得体会!适合初级中级iOS开发工程师。看一遍就能完全理解的assign,retain和copy的区别,看完这篇文章搞定一切iOS面试
assign:assign在修饰属性的时候,主要用于基本数据类型,int,float等,与引用计数无关,所以没有引用计数的增加或减少,当然assign也可以用于修饰对象,但是当用来修饰对象的时候,若对象释放掉了,其指针不会置为nil,weak会!
举个例子
A *a=【【A alloc】init】;
A *b=【a assign】;
此时a和b指向的是堆中同一块内存地址,a和b在栈中的地址也是一样的,如果此时a不需要这个内存了直接释放掉,若b还在使用这块内存,就会crash!
retain:retain会使引用计数增加1,假装A *a=【【A alloc】init】;此时若有b=【a retain】;则a,b同时指向一块内存地址,此时对象的引用计数增加到2,如果此时释放a,并不会造成程序的crash!此时ab所指向的堆中的内存地址相同,但是ab在栈中的地址不同
copy:a和b各有自己的内存,a和b在栈中的地址不同,其所指向的堆中的内存地址也不相同!
总结:assign是一块儿内存,一个指针指向这块内存
retain是一块内存,两个不同的指针指向这个内存
copy是两个不同的内存,各有一个不同的指针指向着!
下面主题是深浅复制,有时间再写