readonly、retain、copy、assign……

1 篇文章 0 订阅
1 篇文章 0 订阅

readonly:表示这个属性是只读的,只生成getter方法,不会生成setter方法.
readwrite:设置可供访问级别,同时生成get方法和set方法的声明和实现
retain:是说明该属性在赋值的时候,set方法的实现是release旧值,然后再retain新值给属性,引用再加1,用于OC对象类型
nonatomic:非原子性访问,不加同步,多线程并发访问会提高性能。注意,如果不加此属性,则默认是两个访问方法都为原子型事务访问。set方法的实现不加锁(比atomic性能高)。

copy:会在内存里拷贝一份对象,两个指针指向不同的内存地址。一般用来修饰NSString等有对应可变类型的对象,因为他们有可能和对应的可变类型(NSMutableString)之间进行赋值操作,为确保对象中的字符串不被修改 ,应该在设置属性是拷贝一份。而若用strong修饰,如果对象在外部被修改了,会影响到属性。
浅Copy:其实就是对指针的复制,复制后便多了一个指向这块内存的指针,内存还是共用的一个。
深Copy:是对内存的复制,复制后两个内存是完全不同的,也就是说两个对象指针分别指向了不同的内存。

weak:修饰Object类型,修饰的对象在释放后,指针地址会被置为nil,是一种弱引用。在ARC环境下,为避免循环引用,往往会把delegate属性用weak修饰;在MRC下使用assign修饰。weak和strong不同的是:当一个对象不再有strong类型的指针指向它的时候,它就会被释放,即使还有weak型指针指向它,那么这些weak型指针也将被清除。

assign:简单赋值,一般用于对基本数据类型的赋值,不更改引用计数,也可以用来修饰对象,但是,被assign修饰的对象在释放后,指针的地址还是存在的,也就是说指针并没有被置为nil,成为野指针。如果后续在分配对象到堆上的某块内存时,正好分到这块地址,程序就会crash。之所以可以修饰基本数据类型,因为基本数据类型一般分配在栈上,栈的内存会由系统自动处理,不会造成野指针。

ARC下的strong等同于MRC下的retain都会把对象引用计数加1。

block属性需要用copy来修饰:
在MRC下,block在创建的时候,它的内存是分配在栈(stack)上的,而不是在堆(heap)上,可能被随时回收。他本身的作于域是属于创建时候的作用域,一旦在创建时候的作用域外面调用block将导致程序崩溃。通过copy可以把block拷贝(copy)到堆,保证block的声明域外使用。在ARC下写不写都行,编译器会自动对block进行copy操作。

block与weak的区别
block:在ARC和MRC下都可用,可修饰对象,也可以修饰基本数据类型。
block对象可以在block被重新赋值,weak不可以。
weak:只在ARC中使用,只能修饰对象,不能修饰基本数据类型(int、bool)。
同时,在ARC下,要避免block出现循环引用,经常会:weak typedof(self) weakSelf = self;

assign与weak
两者都是弱引用,assign通常用于普通类型属性(如int,NSInteger),还有代理属性的修饰,基本上来说两者是可以通用的。
只是后者比前者多了一个功能,后者会在引用的对象被释放的时候将该属性置为nil,而前者依然会指向原来的位置,这样就会变成野指针。在oc中你给你一个nil对象发送消息不会crash,但是给一个对象发送他不能解析的消息是会crash的,所以总的来说weak要比assign安全一些。
像delegate属性建议用weak修饰而不是assign。

retain和strong
他俩都是强引用,除了某些情况下不一样,其他的时候也是可以通用的。
在修饰block属性的时候,相信大家都知道要用copy吧,因为如果不copy的话,block是存放在栈连里面的,他的生命周期会随着函数的结束而出栈的,copy之后会放在堆里面。
strong在修饰block的时候就相当于copy,而retain修饰block的时候就相当于assign,这样block会出现提前被释放掉的危险。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值