浅析iOS的@property属性

@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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值