沙龙晃荡 | 去哪儿、陌陌、ThoughtWorks在主动化运维中的实践!10.28不见不散!
一、一些概念
- 浅Copy:指针的复制,只是多了一个指向这块内存的指针,共用一块内存。
- 深Copy:内存的复制,两块内存是完全不合的,
也就是两个对象指针分别指向不合的内存,互不干涉。
【编辑推荐】
- 序 信赖做iOS开辟的小伙伴们经常会碰到如许的页面: 对于如许的静态列表我们可以直接用 storyboard
- iOS开辟者账号总结
- iOS开辟之MQTT商量
- 学好Mac常用敕令,助力iOS开辟
- iOS开宣布用宏

所以在iPhone这种小型设备上,如不雅没有应用多线程间的通信编程,那么nonatomic是一个异常好的选择。
二、各类属性的解析
weak:
<润饰Object类型,ARC下润饰delegate属性>
1.在ARC情况下,所有指向这个对象的weak指针都将被置为nil。
这个特点很有效,很多codeer都有被指针指向已释放的对象所造成的EXC_BAD_ACCESS困扰过,应用ARC今后,不论是strong照样weak类型的指针,都不会再指向一个已经烧毁的对象,大年夜根本上解决了不测释放导致的crash。
2.润饰Object类型,润饰的对象在释放后,指针地址会被置为nil,是一种弱引用。在ARC情况下,为避免轮回引用,往往会把delegate属性用weak润饰;在MRC下应用assign润饰。weak和strong不合的是:当一个对象不再有strong类型的指针指向它的时刻,它就会被释放,即使还有weak型指针指向它,那么这些weak型指针也将被清除。
< 用于非指针变量。用于基本数据类型 (例如NSInteger)和C数据类型(int, float, double, char, 等),别的还有id >
分析一下,因为self.string1与self.string2指向同一地址,且string2没有retain内存地址,而 self.string1=nil释放了内存,所以string1为nil。声明为weak的指针,指针指向的地址一旦被释放,这些指针都将被赋值为 nil。如许的好处能有效的防止野指针。在c/c++开辟过程中,指针的空妓晔着了后,都要将指针赋为NULL. 在这儿用weak关键字做了这一步。
1.用于对根本数据类型进行复制操作,不更改引用计数。也可以用来润饰对象,然则,被assign润饰的对象在释放后,指针的地址照样存在的,也就是说指针并没有被置为nil,成为野指针。如不雅后续在分派对象到堆上的某块内存时,正好分到这块地址,法度榜样就会crash。之所以可以润饰根本数据类型,因为根本数据类型一般分派在栈上,栈的内存会由体系主动处理,不会造成野指针。
我们常见的id delegate往往是用assign方法的属性而不是retain方法的属性,赋值不会增长引用计数,就是为了防止delegation两端产生不须要的轮回引用。如不雅一个UITableViewController 对象a经由过程retain获取了UITableView对象b的所有权,这个UITableView对象b的delegate又是a, 如不雅这个delegate是retain方法的,那根本上就没有机会释放这两个对象了。本身在设计应用delegate模式时,也要留意这点。因为轮回引用而产生的内存泄漏也是Instrument无法发明的,所以要特别当心。
assign和weak的差别
- 对于assign来说,一长短指针变量,比如说NSInteger之类的基本数据类型、C数据类型,还有就是避免出现轮回引用的时刻,
- 对于weak,其和assign差不多,然则它多了一点,就是,它会主动对该类型变量设置为nil。
copy:
润饰NSString、NSArray、NSDictionary等有对应可变类型的对象
建立一个索引计数为1的对象,然后释放旧对象。
是内容拷贝,会在内存里拷贝一份对象,两个指针指向不合的内存地址。一般用来润饰NSString、NSArray等有对应可变类型的对象,因为他们有可能和对应的可变类型(NSMutableString)之间进行赋值操作,为确保对象中的字符串不被修改 ,应当在设置属性是拷贝一份。而若用strong润饰,如不雅对象在外部被修改了,会影响到属性。
在弗成变对象之间进行转换,strong与copy感化是一样的,然则如不雅在弗成变与可变之间进行操作,我比较推荐copy,这也就是为什么很多处所用copy,而不是strong润饰NSString,NSArray等存在对应弗成变类型的对象了,避免出现不测的数据操作.
strong
ARC下的strong等同于MRC下的retain都邑把对象引用计数加1。
1.在ARC情况下,只要某一对象被一个strong指针指向,该对象就不会被烧毁。如不雅对象没有被任何strong指针指向,那么就会被烧毁。在默认情况下,所有的实例变量和局部变量都是strong类型的。可以说strong类型的指针在行动上跟MRC下得retain是比较类似的
retain
释放旧的对象,将旧对象的值付与输入对象,再进步输入对象的索引计数为1
在MRC中,你须要本身retain一个想要保持的对象,ARC情况下就不须要了。如今独一要做的就是用一个指针指向这个对象,只要指针没有被重置为空,对象就会一向在堆上。当指针指向新值的时刻,本来的对象就会被release一次。这对实例变量,sunthesize的变量或者是局部变量都是实用的。
三、属性之间差别
在iOS开辟中我们知道一般nsstring,就用copy,定义一个模型对象,就用strong,只是赋值的,例如int、double、char 以及CGRect类似的就用assign。但具体为什么可能很多人不是很清跋扈。
这里进内行单的解释:
- 这些关键字根本上是针对属性的set办法。
- 当用copy时,set办法会先release旧值,再copy一个新的对象,reference count 为1(削减了对高低文的依附);当用assign,直接赋值,无retain操作。当用retain,release旧值,retain新值;
推荐阅读
沙龙晃荡 | 去哪儿、陌陌、ThoughtWorks在主动化运维中的实践!10.28不见不散!专业编程范畴老是产生一些相当激烈的┞幅论。例如关于是否以及如何对代码作注释。我们很难平息这些争辩,因为科学地论证专>>>详细阅读
本文标题:iOS开发中各种关键字的区别
地址:http://www.17bianji.com/lsqh/38076.html
1/2 1

网友点评
精彩导读
科技快报
品牌展示