简单聊聊 iOS 中的 @property 属性

43 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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