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

来源:互联网 发布:淘宝互联 编辑:程序博客网 时间:2024/06/06 18:23

1、strong和weak

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

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

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

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

[objc] view plaincopy
  1. @autoreleasepool{  
  2.       Person *p = [Person alloc] init];   
  3.       Dog *d = [Dog alloc] init];  
  4.       p.dog = d;  
  5.       d = nil// 相当于把指向堆内存中的d对象的那根指针去掉  
  6.       NSLog(@"%@"p.dog); // 还是能打印出来的,因为p中的dog属性是强指针  
  7. }   
[objc] view plaincopy
  1. 普通对象做属性使用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
原创粉丝点击