属性设置@property之retain,assign,weak,strong,copy

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同样的道理。

 

 

 

 

 

转载于:https://www.cnblogs.com/xiejw/p/5143885.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值