IOS开发基础Object-C(09)—OC内存管理(3)-@property的参数详解
2015-11-23 19:35
537 查看
在 IOS开发基础Object-C(06)—@property 和@synthesize语法中我们已经大体了解了@property的参数,今天我们就来详细解释一下@property关于内存管理的用法。
首先,我们来新建两个类,Book和Student类
Student.h
Student.m
Book.h
Book.m
下面我们来做什么事呢?先做一个假设,假如我们又多出了一个Score类,每一个学生都有一个分数
所以我们又在Student中声明Score类
Student.h
Student.m
是不是就要多出一个setter的内存管理方法?再假如我们有一百个这样的类,我们是不是要多出一百个setter内存管理的方法?这样是不是很蠢?大量的垃圾代码看着就很菜鸟,还是Too young too simple ~Sometime naive,其实只要简单的在@property加一个参数,这些问题就都解决了
先来介绍第一个参数:
retain ( setter方法对参数进行release旧值,再retain新值。)
编译器运行的时候遇见retain参数时会自动展开成
copy (setter方法对参数进行release旧值,再copy新值)和retain用法是一样的。
剩下的参数用法也很简单,我就不一一详细列举了,简单提一下atomic和nonatomic
atomic
保证多线程访问下的安全, 但浪费系统资源, 原子性控制的默认设置.
nonatomic
禁止多线程,变量保护,提高性能
在iPhone手机中,一般不需要多线程的,所以我们在开发中最好把nonatomic参数写上
声明property的语法为:
@property (参数1,参数2) 类型 名字;
其中参数主要分为三类:
读写属性: (readwrite/readonly/setter = /getter = )
setter语意:(assign/retain/copy)
原子性: (atomicity/nonatomic)
各参数意义如下:
readwrite
产生setter\getter方法
readonly
只产生简单的getter,没有setter, 默认的读写属性.
setter =
指定生成setter方法的名字
getter =
指定生成getter方法的名字
assign
默认类型,setter方法直接赋值,而不进行retain操作, 适用于基本数据类型, 对对象类型, 不会发生引用计数变化.
retain
setter方法对参数进行release旧值,再retain新值。
copy
setter方法进行Copy操作,与retain一样
atomic
保证多线程访问下的安全, 但浪费系统资源, 原子性控制的默认设置.
nonatomic
禁止多线程,变量保护,提高性能
相关链接
IOS开发基础Object-C(06)—@property 和@synthesize语法
教学视频连接
http://pan.baidu.com/s/1o66GkX0
首先,我们来新建两个类,Book和Student类
Student.h
#import <Foundation/Foundation.h> #import "Book.h" @interface Student :NSObject @property Book *book; @end
Student.m
#import "Student.h" @implementation Student #pragma mark setter方法内存管理 -(void)setBook:(Book *)book{ if(_book!=book){ [_book release]; _book=[book retain]; } } #pragma mark 回收对象 - (void)dealloc{ NSLog(@"student 被销毁了"); [_book release]; [super dealloc]; //不要忘了这一句,而且是放在最后的。 } @end
Book.h
#import <Foundation/Foundation.h> @interface Book : NSObject @end
Book.m
#import "Book.h" @implementation Book - (void)dealloc{ NSLog(@"book %f 被销毁了", price); [super dealloc];} @end
下面我们来做什么事呢?先做一个假设,假如我们又多出了一个Score类,每一个学生都有一个分数
所以我们又在Student中声明Score类
Student.h
#import <Foundation/Foundation.h> #import "Book.h" @interface Student :NSObject @property Book *book; @property Score *score; @end
Student.m
#import "Student.h" @implementation Student #pragma mark setter方法内存管理 -(void)setBook:(Book *)book{ if(_book!=book){ [_book release]; _book=[book retain]; } } -(void)setScore:(Score *)score{ if(_score!=score){ [_score release]; _score=[score retain]; } } #pragma mark 回收对象 -(void)dealloc{ NSLog(@"student 被销毁了"); [_book release]; [super dealloc]; //不要忘了这一句,而且是放在最后的。} @end
是不是就要多出一个setter的内存管理方法?再假如我们有一百个这样的类,我们是不是要多出一百个setter内存管理的方法?这样是不是很蠢?大量的垃圾代码看着就很菜鸟,还是Too young too simple ~Sometime naive,其实只要简单的在@property加一个参数,这些问题就都解决了
先来介绍第一个参数:
retain ( setter方法对参数进行release旧值,再retain新值。)
@property(retain) Book *book;
编译器运行的时候遇见retain参数时会自动展开成
-(void)setBook:(Book *)book{ if(_book!=book){ [_book release]; _book=[book retain]; } }
copy (setter方法对参数进行release旧值,再copy新值)和retain用法是一样的。
剩下的参数用法也很简单,我就不一一详细列举了,简单提一下atomic和nonatomic
atomic
保证多线程访问下的安全, 但浪费系统资源, 原子性控制的默认设置.
nonatomic
禁止多线程,变量保护,提高性能
在iPhone手机中,一般不需要多线程的,所以我们在开发中最好把nonatomic参数写上
附@property 参数说明:
声明property的语法为: @property (参数1,参数2) 类型 名字;
其中参数主要分为三类:
读写属性: (readwrite/readonly/setter = /getter = )
setter语意:(assign/retain/copy)
原子性: (atomicity/nonatomic)
各参数意义如下:
readwrite
产生setter\getter方法
readonly
只产生简单的getter,没有setter, 默认的读写属性.
setter =
指定生成setter方法的名字
getter =
指定生成getter方法的名字
assign
默认类型,setter方法直接赋值,而不进行retain操作, 适用于基本数据类型, 对对象类型, 不会发生引用计数变化.
retain
setter方法对参数进行release旧值,再retain新值。
copy
setter方法进行Copy操作,与retain一样
atomic
保证多线程访问下的安全, 但浪费系统资源, 原子性控制的默认设置.
nonatomic
禁止多线程,变量保护,提高性能
相关链接
IOS开发基础Object-C(06)—@property 和@synthesize语法
教学视频连接
http://pan.baidu.com/s/1o66GkX0
相关文章推荐
- Lua的内存管理浅析
- JS中如何设置readOnly的值
- 跟我学习JScript的Bug与内存管理
- C#中Property和Attribute的区别实例详解
- JavaScript中检查对象property的存在性方法介绍
- JavaScript中对象property的删除方法介绍
- JavaScript中遍历对象的property的3种方法介绍
- 跟我学习javascript的垃圾回收机制与内存管理
- javascript 对象属性property与元素属性attribute的浏览器支持
- jquery设置元素的readonly和disabled的写法
- javascript中input中readonly和disabled区别介绍
- c#.net中const和readonly的区别
- JavaScript Table排序 2.0 (更新)
- jquery批量设置属性readonly和disabled的方法
- .NET中TextBox控件设置ReadOnly=true后台取不到值三种解决方法
- 深入探讨PHP中的内存管理问题
- JavaScript对象的property属性详解
- linux 内存管理机制详细解析
- 解析PHP中的内存管理,PHP动态分配和释放内存
- JavaScript中property和attribute的区别详细介绍