看到好的文章就忍不住转发了,好东西要和大家一起分享才够意思嘛。
好多地方写的过于细化发杂,其实object-c它可并不像那么复杂啊。
有一张图让你学完oc的,下回有空发出来分享给大家。(你别不信,真的比那些几百页的书强)
//1. 自动有一个_weight
//2. setter/getter
//3. nonatomic/atomic, 默认atomic
//4. assign(a. 用于C语言的类型; b. 用于OC对象类型时,不会影响引用计数,并且当所指向的对象销毁时,不会自动变为nil)
//5. retain, 只能用于对象类型,使引用计数加1
//6. copy
//7. strong(ARC, 相当于retain)
//8. weak(ARC, 相当于assign,但是只能用于OC的对象,并且当对象销毁时,自动变为nil)
//9. readonly/readwrite
//10. getter/setter
大概要注意的以上几个类属性,以下文章讲了其中几个,下面大家见下文:
atomic和nonatomic用来决定编译器生成的getter和setter是否为原子操作。
assign
retain
copy
copy与retain:
Copy其实是建立了一个相同的对象,而retain不是:
1.比如一个NSString 对象,地址为0×1111 ,内容为@”STR”,Copy 到另外一个NSString 之后,地址为0×2222 ,内容相同。
2.新的对象retain为1
总结:retain 是指针拷贝,copy 是内容拷贝。
assign与retain:
1. 接触过C,那么假设你用malloc分配了一块内存,并且把它的地址赋值给了指针a,后来你希望指针b也共享这块内存,于是你又把a赋值给(assign)了b。此时a和b指向同一块内存,请问当a不再需要这块内存,能否直接释放它?答案是否定的,因为a并不知道b是否还在使用这块内存,如果a释放了,那么b在使用这块内存的时候会引起程序crash掉。
2. 了解到1中assign的问题,那么如何解决?最简单的一个方法就是使用引用计数(reference counting),还是上面的那个例子,我们给那块内存设一个引用计数,当内存被分配并且赋值给a时,引用计数是1。当把a赋值给b时引用计数增加到2。这时如果a不再使用这块内存,它只需要把引用计数减1,表明自己不再拥有这块内存。b不再使用这块内存时也把引用计数减1。当引用计数变为0的时候,代表该内存不再被任何指针所引用,系统可以把它直接释放掉。
总结:上面两点其实就是assign和retain的区别,assign就是直接赋值,从而可能引起1中的问题,当数据为int, float等原生类型时,可以使用assign。retain就如2中所述,使用了引用计数,retain引起引用计数加1, release引起引用计数减1,当引用计数为0时,dealloc函数被调用,内存被回收。
-------------------------------------------------------------------------------------
自己研究了一下,,上面文章的说法是对的,,但是遗漏了一点东西.
他说 copy是内容的拷贝
但是,如果是copy的是一个NSArray呢?比如,
NSArray *array = [NSArray arrayWithObjects:@"hello",@"world",@"baby"];
NSArray *array2 = [array copy];
这个时候,,系统的确是为array2开辟了一块内存空间,但是我们要认识到的是,array2中的每个元素,,只是copy了指向array中相对应元素的指针.这便是所谓的"浅复制".了解到这一点非常重要