iOS开发[email protected]属性的使用

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:基本数据类型

时间: 2024-08-10 12:17:35

iOS开发[email protected]属性的使用的相关文章

mask层--- ios开发view圆角属性的layer层的实质

今天突然领悟了之前学习的一些基础的UI属性 就是在我们设置view的圆角的时候 比方说下面的代码 UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(10, 10, 60, 60)]; button.layer.masksToBounds = YES; button.layer.cornerRadius = 30; 这里给button设置圆角属性 以前一直这么写 知道layer是view的绘制的一层 一直这么用 今天突然领悟

[email protected]属性的使用及注意问题:@property(assign)int name;

 句型:@property(assign)int name: 分析(公式):@property(assign)int name = 实例_name + 存储方法setName + 取值方法getName. 注意:在实现方法中同时自定义(或重写)setName.getName方法时,需要加上@synthesize name:即对变量实例化一下. @property属性的的好处:可以在主函数中使用点语法:在实现文件中可以添加自定义的筛选条件,比如如果输入的学生年龄<0,则会提示请重新输入正确的年

盘点iOS开发中property属性常用关键字

一.关键字说明 1.@synthesize:自动生成成员变量相应的存取方法,可以使用点语法操作该变量的存取. 2.@implementation:  表明类的实现  ,以@end 结束. 3.self  :类似java语言当中的this ,是隐藏指针  指向接受消息的对象的指针 .消息所调用的方法使用该指针参数查找它要使用的实例. 4.super : 调用父类的方法 .    self = [ super init];  判断是否可以成功初始化 如果父类成功初始化 那么将会赋值给 self  ,

iOS开发备忘录:属性列表文件数据持久化

原文:http://www.cnblogs.com/wzk89/p/3939782.html 属性列表文件是一种XML文件,Foundation框架中的数组和字典等都可以于属性列表文件相互转换. NSArray类常用读写属性列表文件的方法: +arrayWithContentsOfFile:类级构造方法,用于从属性列表文件中读取数据,创建NSArray对象. -initWithContentsOfFile:实例构造方法,用于从属性列表文件中读取数据,创建NSArray对象. -writeToFi

iOS开发UIPickerView常用属性方法

// //  ViewController.m //  UIPickerViewAll #import "ViewController.h" @interface ViewController () @end @implementation ViewController /* UIPickView控件常用的方法和属性: (1)  - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView; 返回Picke

iOS开发UIScrollView常见属性和方法

一.ScrollView常用方法和属性 @property(nonatomic)CGPoint contentOffset; 设置滚动的偏移量 @property(nonatomic)CGSize contentSize; 设置滑动区域 @property(nonatomic,assign) id<UIScrollViewDelegate>      delegate; 设置UIScrollView的代理 @property(nonatomic,getter=isDirectionalLock

iOS开发解决 jsonModel 属性跟系统的重复

-(id)initWithDic:(NSDictionary *)dic { if (self = [super init]) { [self setValuesForKeysWithDictionary:dic]; } return self; } -(void)setValue:(id)value forUndefinedKey:(NSString *)key{ if ([key isEqualToString:@"new_app_picpath"]) { _mynew_app_p

iOS开发UItextview常用属性方法

// //  ViewController.m //  TextViewAll #import "ViewController.h" @interface ViewController ()<UITextViewDelegate> @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor = [UIColor yellowC

iOS开发基础----OC/UI控件

1. 前缀-> 只是代码组合之后,用来区分谁写的代码 2. 工具包frameworks 总共4个工具包,前3个是经常用的,最后一个是测试用的. 3. iphone 6 的SDK 是建立在 ios 8.0以上的 4.ios的界面虽然发生了改变,但还是从main.m中执行的,只是main.m没有放在导航区,而是放在Supporting Files 分组中.注意不是文件夹,是分组. main.m里有这个 return UIApplicationMain(argc, argv, nil, NSStrin