1.assign
assign只是简单赋值,不更改索引计数,适用于基础数据类型 (例如NSInteger,CGFloat)和C数据类型(int, float, double, char, 等)
2.copy
copy用来建立一个索引计数为1的对象,然后释放旧对象, 常用语NSString ,指在赋值时使用传入值的一份拷贝。
3.retain
retain用来释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1
对其他NSObject和其子类,对参数进行release旧值,再retain新值。
retain的语法为:
- (void)setName:(NSString *)newName { if (name != newName) { [name release]; name = [newName retain]; //注意: 把对象添加到数组中时,引用计数将增加对象的引用次数+1。 // name’s retain count has been bumped up by 1 } }
4.copy与retain:
Copy其实是建立了一个相同的对象,而retain不是:
比如一个NSString对象,地址为0×1211,内容为@"str1",Copy到另外一个NSString之后,地址为0×2211,内容相同,新的对象retain为1,旧有对象没有变化,retain到另外一个NSString之后,地址相同(建立一个指针,指针拷贝),内容当然相同,同时建立一个指针指向原来的NSString,这个对象的retain值+1,可以说,retain是指针拷贝,而copy是内容拷贝。
同样理解,retain的set方法是浅复制,而copy的set方法是深复制。
5.assign与retain:
assign就是直接赋值,从而可能引起1中的问题,当数据为int, float等原生类型时,可以使用assign。retain使用了引用计数,retain引起引用计数加1, release引起引用计数减1,当引用计数为0时,dealloc函数被调用,内存被回收。
6.strong和weak
6.1.strong和weak原理
两者都是对象修饰词 ,用来修饰变量和指针,strong表示强指针,weak表示弱指针。
假设创建person对象,此时计数器加一,release之后,计数器减1,
ARC中使用 强指针和弱指针来判断是否销毁
对象创建以后默认情况下全是强指针 ,然而在创建对象的表达式前加上_weak修饰的时候表示对象为弱指针。
内存中给person创建内存,指针指向person对象,arc判断原则,只要没有任何强指针指向对象,对象就会被销毁。使用strong和weak主要是防止出现内存泄露,死循环,还有就是节省内存。
6.2 视图中插入控件为什么用weak?
控制器里拖入控件的时候系统默认为weak,此时就会有人产生疑问,以为weak为弱指针,此时创建之后会很快会消除,这样会不会造成添加的控件也消除?然而并不会,因为控制器里有view和相应控件,view的父类UIview里有一个数组subview,将button创建在view上, view的subview就会有指针指向button,此时button继承自UIButton,即存在指针指向UIButton,所以weak并不会造成实质影响。没有button此时按钮照样起作用,因为只要view存在,则其button就存在,所以此时强弱指针并不会对程序造成影响,用弱指针的目的是为了及时清空内存,提高性能。
6.3 代理控件用weak,代理为什么用weak
代理方法如delegate,datasource使用的都是assign,为弱指针,比如在一个创建一个tableview,此时tableview指向UITableView,如果设置delegate方法,则存在一个指针指UITableviewController,然而tableview创建之后就在UITableviewController内,控制器拥有控件,此时,如果delegate如果使用强指针,则就会造成死循环。imageview,scrollview,collectionview同样的道理。