iOS开发--@property属性的使用

1、strong和weak

strong:强指针/强引用;默认情况下,任何指针都是强指针 ;也就是说,我们平常定义的时候Person *p =[ [Person alloc] init];都是strong;
weak:弱指针/弱引用;使用_weak修饰的指针。

ARC(自动引用计数)的判断准则:只要没有任何强指针指向,这个对象就会被销毁;
当然超过自己的作用范围也会被销毁;

但是程序执行完,仍然有强指针指向(你的strong属性指向我,我的strong属性指向你),就会造成内存泄露

@autoreleasepool{
	// 一开始就是弱指针指向 ,这一行代码过掉,p对象就会被销毁(调用dealloc方法)
	_weak Person *p = [Person alloc] init]; 
}

@autoreleasepool{
	  Person *p = [Person alloc] init]; 
	  Dog *d = [Dog alloc] init];
	  p.dog = d;
	  d = nil; // 相当于把指向堆内存中的d对象的那根指针去掉
	  NSLog(@"%@"p.dog); // 还是能打印出来的,因为p中的dog属性是强指针
} 
普通对象做属性使用strong:这样保证了,当前对象p在,p的dog属性指向对象也在

2、UI对象为什么使用weak?

对于UI对象,weak和strong都可以,但是没必要用strong。
在UIViewController中的view属性是个强指针:@property(nonatomic,retain) UIView *view; (iOS5之前retain就是strong)
在view中又有一个subViews数组,数组是个强指针,0的位置存放的强指针指向的是UIButton ;
所以Vc在--view就在--subViews就在--0位置存放的强指针就在,指向的UIButton对象就在,所以没有UI控件没必要定义strong
iOS5之前的assign就是weak

3、delegate为什么用weak?

Vc中view属性是strong,指向view;如果view中delegate是strong,一般指向Vc;两根都是strong就会出问题(内存泄露),所以delegate必须是weak

4、这张图片很好的解释了上述问题:


比如delegate为什么使用weak?

如果delegate使用strong,当程序退出,UIWindow对象销毁之后,UITableViewController对象也要被销毁,

但是由于被delegate是strong并且指向了Vc,所以Vc不会被销毁,造成内存泄露。

5、@property属性的使用

weak(assign):代理\UI控件
strong(retain):普通对象
copy:字符串
assign:基本数据类型









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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值