iOS 对象属性详细介绍
iOS对象属性
oc对象的一些属性:
retain,strong,copy,weak,assign,readonly,readwrite,unsafe_unretained
下面来分别讲讲各自的作用和区别:
retain,计数器加1,(增加一个指向内存的指针)对应release(计数器-1)setter方法对参数进行release旧值再retain新值,所有实现都是这个顺序
-(void)setBackView:(UIView*)backView{
if(_backView!=backView){
[_backViewrelease];
_backView=[backViewretain];
}
return_backView;
}
copy,拷贝,新开地址,内容拷贝,setter方法进行Copy操作,与retain处理流程一样,先旧值release,再Copy出新的对象,retainCount为1。这是为了减少对上下文的依赖而引入的机制。
(提一点深拷贝shallowcopy,浅拷贝deepcopy)
这篇文章比较直观(http://blog.csdn.net/omegayy/article/details/7311839)
官方文档(https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Collections/Articles/Copying.html)
copy和mutableCopy调用后表现的行为到底是什么样完成取决于类本身NSCopying和NSMutableCopying协议是如何实现的。
strong,强引用,计数器加1,和retain一样(对应retain和copy)
weak,弱引用
strong用来修饰强引用的属性; @property(strong)SomeClass*aObject; 对应原来的 @property(retain)SomeClass*aObject;和@property(copy)SomeClass*aObject; weak用来修饰弱引用的属性; @property(weak)SomeClass*aObject; 对应原来的 @property(assign)SomeClass*aObject;
__weak,__strong用来修饰变量,此外还有__unsafe_unretained,__autoreleasing都是用来修饰变量的。
__strong是缺省的关键词。
__weak声明了一个可以自动nil化的弱引用。
__unsafe_unretained声明一个弱应用,但是不会自动nil化,也就是说,如果所指向的内存区域被释放了,这个指针就是一个野指针了。
__autoreleasing用来修饰一个函数的参数,这个参数会在函数返回的时候被自动释放。
strong和weak的区别
(weak和strong)不同的是当一个对象不再有strong类型的指针指向它的时候它会被释放 ,即使还有weak型指针指向它。
一旦最后一个strong型指针离去,这个对象将被释放,所有剩余的weak型指针都将被清除。
可能有个例子形容是妥当的。
想象我们的对象是一条狗,狗想要跑掉(被释放)。
strong型指针就像是栓住的狗。只要你用牵绳挂住狗,狗就不会跑掉。如果有5个人牵着一条狗(5个strong型指针指向1个对象),除非5个牵绳都脱落,否着狗是不会跑掉的。
weak型指针就像是一个小孩指着狗喊到:“看!一只狗在那”只要狗一直被栓着,小孩就能看到狗,(weak指针)会一直指向它。只要狗的牵绳脱落,狗就会跑掉,不管有多少小孩在看着它。
只要最后一个strong型指针不再指向对象,那么对象就会被释放,同时所有的weak型指针都将会被清除。
assign,用于简单类型,计数器不加,直接赋值,一个指针,一块地址,setter方法直接赋值,不进行任何retain操作,为了解决原类型与环循引用问题
readonly,只读,只生成get方法,没有set方法
readwrite,默认,可读写,set,get方法都会生成
unsafe_unretained,类似weak,所谓的unSafe就是指会容易出现也指针的情况,慎用
setter=xxxx,声明对象的set方法
getter=xxxx,声明对象的get方法
nonatomic,非原子操作,系统不添加代码,运行速度相对快,但数据操作在多线程情况下相对不安全
atomic,原子操作,编译时会增加很多加锁解锁代码,数据操作在多线程情况下相对安全
*使用assign:对基础数据类型(NSInteger)和C数据类型(int,float,double,char,等)
*使用copy:对NSString
*使用retain:对其他NSObject和其子类
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!