在网上看到一个解释weak和strong的例子,感觉挺形象的,如下: 一、weak和strong的区别 (weak和strong)不同的是 当一个对象不再有strong类型的指针指向它的时候 它会被释放 ,即使还有weak型指针指向它。 一旦最后一个strong型指针离去 ,这个对象将被释放,所有剩余的weak型指针都将被清除。 可能有个例子形容是妥当的。 想象我们的对象是一条狗,狗想要跑掉(被释放)。 strong型指针就像是栓住的狗。只要你用牵绳挂住狗,狗就不会跑掉。如果有5个人牵着一条狗(5个strong型指针指向1个对象),除非5个牵绳都脱落 ,否着狗是不会跑掉的。 weak型指针就像是一个小孩指着狗喊到:“看!一只狗在那” 只要狗一直被栓着,小孩就能看到狗,(weak指针)会一直指向它。只要狗的牵绳脱落,狗就会跑掉,不管有多少小孩在看着它。 只要最后一个strong型指针不再指向对象,那么对象就会被释放,同时所有的weak型指针都将会被清除。 二、weak和assign的区别 1、assign是指针赋值,不对引用计数操作,使用之后如果没有置为nil,可能就会产生野指针;而weak一旦不进行使用后,永远不会使用了,就不会产生野指针! 三、 alloc 对象分配后引用计数为1 retain 对象的引用计数+1 copy copy 一个对象变成新的对象(新内存地址) 引用计数为1 原来对象计数不变 release 对象引用计数-1 如果为0释放内存 autorelease 对象引用计数-1 如果为0不马上释放,最近一个个pool时释放 四、1.假设你用malloc分配了一块内存,并且把它的地址赋值给了指针a,后来你希望指针b也共享这块内存,于是你又把a赋值给(assign)了b。此时a和b指向同一块内存,请问当a不再需要这块内存,能否直接释放它?答案是否定的,因为a并不知道b是否还在使用这块内存,如果a释放了,那么b在使用这块内存的时候会引起程序crash掉。2.了解到1中assign的问题,那么如何解决?最简单的一个方法就是使用引用计数(referencecounting),还是上面的那个例子,我们给那块内存设一个引用计数,当内存被分配并且赋值给a时,引用计数是1。当把a赋值给b时引用计数增加到2。这时如果a不再使用这块内存,它只需要把引用计数减1,表明自己不再拥有这块内存。b不再使用这块内存时也把引用计数减1。当引用计数变为0的时候,代表该内存不再被任何指针所引用,系统可以把它直接释放掉。3.上面两点其实就是assign和retain的区别,assign就是直接赋值,从而可能引起1中的问题,当数据为int,float等原生类型时,可以使用assign。retain就如2中所述,使用了引用计数,retain引起引用计数加1,release引起引用计数减1,当引用计数为0时,dealloc函数被调用,内存被回收。4.copy是在你不希望a和b共享一块内存时会使用到。a和b各自有自己的内存。五、 1.assign:用于非指针变量。用于基础数据类型 (例如NSInteger)和C数据类型(int, float, double, char)另外还有id 反正记住:前面不需要加 “*” 的就用assign吧,weak 就是相当于assign 2.retian :释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1,用于指针变量。就是说你定义了一个变量,然后这个变量在程序的运行过程中会被更改,并且影响到其他方法。xcode4.3及以后版本上面开发,retian和strong都是一样的,没区别 3.copy : 效果其实和retain没什么两样,唯一的区别就是copy只用于NSString而不能用于NSMutableString,如果当一个类继承NSObject,那么这个类里面的属性需要使用copy。 retain是指针拷贝,copy是内容拷贝。 六、strong 和weak
iOS 5 中对属性的设置新增了strong 和weak关键字来修饰属性(iOS 5之前不支持ARC)
strong 用来修饰强引用的属性;
@property (strong) SomeClass * aObject; 对应原来的 @property (retain) SomeClass * aObject; 和 @property (copy)SomeClass * aObject; weak 用来修饰弱引用的属性; @property (weak) SomeClass * aObject; 对应原来的 @property (assign) SomeClass * aObject;
retain、strong、weak、assign区别
最新推荐文章于 2019-10-20 11:24:15 发布