您的位置:首页 > 移动开发 > IOS开发

浅析iOS的@property属性

2015-12-03 20:07 253 查看
@property是iOS编程中很基础、很常见的一个声明属性的语法,他有三个基本属性

1、strong\weak\copy\assign

2、nonatomic\atomic

3、readonly\readwrite

其中,默认的属性为assign\atomic\readwrite

readonlu和readwrite

readonly为只生成了setter方法、readwrite为生成了getter和setter方法。

setter为创建时候所调用的方法,只有在使用self.xxx的时候才会调用

getter为获取他的值的时候调用的,经常用于懒加载,同样只有在self.xxx的时候才会使用

懒加载为
-(NSMutableArray *)btn_arr{
if(!_btn_arr){
_btn_arr = [NSMutableArray array];
}
return _btn_arr;
}
意思是在获取他的时候,如果判断值为空,那么新建一个并且返回,否则直接返回原先的

setter目前我用的比较少

他们主要的用处还是用于限制属性的访问情况

nonatomic\atomic

atomic保证了原子性,即保证了setter和getter的原语性,这个为默认的情况,为了保证在多线程的情况下,编译器会自动生成互斥加锁的代码,保证同步

nonatomic不考虑多线程的情况,不考虑互斥加锁情况,提高效率

一般情况下我们是不需要多线程的,用nonatomic即可

用了atomic就是多线程中只有一个线程可以访问该属性,否则为nonatomic的话多个线程可同时访问该属性

strong\weak\copy\assign

这一块是比较重要的地方

@property (nonatomic, strong) NSString *string1;

@property (nonatomic, strong) NSString *string2;


self.string1 = @"String 1";

self.string2 = self.string1;

self.string1 = nil;

NSLog(@"String 2 = %@", self.string2);


@property (nonatomic, weak) NSString *string1;

@property (nonatomic, weak) NSString *string2;


self.string1 = @"String 1";

self.string2 = self.string1;

self.string1 = nil;

NSLog(@"String 2 = %@", self.string2);


前面的输出的是String 2 = String 1

后面的输出的是String 2 = null

说明strong会把计数器+1,string1释放了,但是string2没有释放,还是指向了String 1

weak则是必须指向一个强引用,如果强引用被释放掉了,既对象消失,那么他也会被设置为空,可以用在防止block循环上

assign的话要求是传的对象必须为基础数据类型,例如NSInteger,int等

copy的使用一般是在有用到mutable的情况下使用的,例如NSString,确保NSString属性和NSMutableString属性相互赋值时的正确,可以使用copy,他会在堆中另外扩展出空间分配,相当于深拷贝了.

copy一般适用于NSString等不可变的对象,因为是重新创建了对象,并且内容不变,因此不用担心后面的操作会对该属性的值产生影响。

@property (nonatomic,strong) NSString *str1;
@property (nonatomic,copy) NSString *str2;


NSMutableString *m_str = [NSMutableString stringWithString:@"hello"];
self.str1 = m_str;
self.str2 = m_str;

[m_str appendString:@" Lucy"];

NSLog(@"\nstr1 = %@\nstr2 = %@\nm_str = %@",self.str1,self.str2,m_str);


输出结果是

str1 = hello Lucy

str2 = hello

m_str = hello Lucy
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: