当前位置: 首页 > 科技观察

iOS开发中各种关键字的区别

时间:2023-03-12 09:16:08 科技观察

1.一些概念ShallowCopy:指针的拷贝只是多了一个指向这块内存的指针,共享一块内存。DeepCopy:内存复制,两块内存完全不同,即两个对象指针指向不同的内存,互不干扰。Atomic是Objc使用的一种线程保护技术。基本上,它可以防止在写入未完成时数据错误被另一个线程读取。而且这种机制会消耗系统资源,所以如果不使用多线程间的通信编程,nonatomic在iPhone这样的小型设备上是一个非常好的选择。二、weak各种属性分析:<修改对象类型,修改ARC下delegate属性>1、在ARC环境下,所有指向这个对象的weak指针都会被置为nil。这个功能非常有用。很多编码人员都被指向已释放对象的指针导致的EXC_BAD_ACCESS所困扰。使用ARC后,无论是强指针还是弱指针,都不再指向被销毁的对象。从根本上解决了意外释放导致的崩溃。2.修改对象类型。修改后的对象被释放后,指针地址会被置为nil,属于弱引用。在ARC环境下,为了避免循环引用,delegate属性经常用weak修饰;在MRC中,它是用assign修改的。weak和strong的区别在于,当一个对象不再有强类型指针指向它时,它就会被释放,即使还有弱类型指针指向它,那么这些弱类型指针也会被清除。assign:<用于非指针变量。用于基本数据类型(如NSInteger)和C数据类型(int、float、double、char等),id>1。它用于在不改变引用计数的情况下复制基本数据类型。它还可以用于修改对象。但是,assign修饰的对象被释放后,指针的地址仍然存在,也就是说指针没有被置为nil,变成了野指针。如果后面把对象分配到堆上的某块内存,恰好分配了这个地址,程序就会崩溃。之所以可以修改基本数据类型,是因为基本数据类型一般分配在栈上,栈内存会被系统自动处理,不会造成野指针。我们常见的id委托通常使用分配式属性而不是保留式属性。赋值不会增加引用计数,只是为了防止赋值两端不必要的循环引用。如果一个UITableViewController对象a通过retain获得了UITableView对象b的所有权,而这个UITableView对象b的delegate是a,如果delegate是retain的话,这两个对象基本没有机会释放。在设计和使用委托模式时也要注意这一点。循环引用导致的内存泄漏,Instrument无法发现,所以要小心。copy:修改NSString、NSArray、NSDictionary等对应变量类型的对象,创建一个索引计数为1的对象,然后释放旧对象。是内容拷贝,会拷贝内存中的一个对象,两个指针指向不同的内存地址。一般用于修饰NSString、NSArray等对应变量类型的对象,因为它们可能会与对应的变量类型(NSMutableString)进行赋值操作。为确保对象中的字符串不被修改,应该在属性中设置为副本。而如果用strong修饰的话,如果对象被外部修饰,会影响到属性。不可变对象之间的转换,strong和copy的作用是一样的,但是如果你在immutable和variable之间操作,我推荐copy,这也是为什么很多地方使用copy而不是strong来修饰NSString。有不可变的对象如NSArray来避免意外的数据操作。strongARC下的strong相当于MRC下的retain,对象引用计数会加1。1.在ARC环境下,只要对象是强指针,对象就不会被销毁。如果对象没有被任何强指针指向,它就会被销毁。默认情况下,所有实例变量和局部变量都是强类型。可以说强类型指针的行为类似于MRC下的retain。retain释放旧对象,将旧对象的值赋值给输入对象,然后将输入对象的索引计数加1。在MRC中,需要自己retain一个你想保留的对象,你在ARC环境中不需要它。现在唯一要做的就是指向这个对象的指针,只要指针不重置为空,该对象就会保留在堆上。当指针指向新值时,原对象将被释放一次。这对于实例变量、sunthesize变量或局部变量很有用。3、属性的区别在iOS开发中,我们知道对于一般的nsstring,我们使用的是copy,而在定义一个model对象时,我们使用的是strong,它只赋值,比如int,double,char和CGRect,以及类似的使用分配。但是具体为什么很多人可能不是很清楚。这里简单解释一下:这些关键字基本上是属性的设置方法。使用copy时,set方法会先释放旧值,然后复制一个新的对象,引用计数为1(减少对上下文的依赖);使用assign时,直接assign,不做retain操作。使用retain时,释放旧值,保留新值;strong和weakstrong的区别类似于retain,它会将对象的引用计数器加1,并分配内存地址。weak类似于指针,它只是指向一个地址,但它本身并不分配内存地址。当指向的地址被销毁时,指针自动为nil。示例:@synthesizestring1;@合成字符串2;猜猜,下面的输出是什么?self.string1=[[NSStringalloc]initWithUTF8String:"string1"];self.string2=self.string1;self.string1=nil;NSLog(@"String2=%@",self.string2);结果为:String2=null分析一下,因为self.string1和self.string2指向同一个地址,string2不保留内存地址,self.string1=nil是释放内存,所以string1为nil。声明为weak的指针,一旦指针指向的地址被释放,这些指针就会被赋值为nil。这个好处可以有效的防止野指针。在c/c++开发过程中,释放指针空间后,必须将指针赋值为NULL。这一步在这里用weak关键字完成。assign和weak的区别对于assign,一个是非指针变量,比如NSInteger等基本数据类型,C数据类型,避免循环引用。对于weak,它类似于assign,但是它多了一点,就是会自动将类型变量设置为nil。PS:***如果大家发现那里有什么问题,欢迎批评指正,觉得有用的话点个赞吧~