浅析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的时候才会使用
懒加载为
setter目前我用的比较少
他们主要的用处还是用于限制属性的访问情况
nonatomic不考虑多线程的情况,不考虑互斥加锁情况,提高效率
一般情况下我们是不需要多线程的,用nonatomic即可
用了atomic就是多线程中只有一个线程可以访问该属性,否则为nonatomic的话多个线程可同时访问该属性
前面的输出的是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等不可变的对象,因为是重新创建了对象,并且内容不变,因此不用担心后面的操作会对该属性的值产生影响。
输出结果是
str1 = hello Lucy
str2 = hello
m_str = hello Lucy
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
相关文章推荐
- IOS程序之间的文件共享
- iOS Get同步与异步
- Local declaration of 'XXX' hides instance variable
- 单例模式两种创建方法详解
- ios 里如何处理四舍五入的问题
- iOS为有约束的空间添加动画
- ios (底层runtime)实现万能跳转
- 常用的iOS开源库
- iOS 点击子视图不让其响应父视图手势
- ios开发之block的使用,及注意事项
- iOS在线安装环境搭建
- iOS常用宏定义
- iOS8--关于regular和compact的理解
- 一切重新开始--一个iOS工程师的工作之旅-001
- iOS用户点击退出按钮,跳到登录界面的代码控制
- iOS开发 @synthesize + @property 用法
- nagios 被监控端一键配置脚本
- iOS 事件处理机制与图像渲染过程
- iOS-数据持久化-第三方框架FMDB的使用
- 项目适配iOS9 遇到的坑坑娃娃