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

来源:互联网 发布:betterzip mac 破解版 编辑:程序博客网 时间:2024/06/08 07:35

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
原创粉丝点击