持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第6天,点击查看活动详情
前言
@property 是 iOS 编程中最为基础与常见的一个声明属性的语法,他有三个基本属性
1、strong\weak\copy\assign
2、nonatomic\atomic
3、readonly\readwrite
其中,默认的属性为assign\atomic\readwrite
readonly和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