在 IOS开发基础Object-C(06)—@property 和@synthesize语法中我们已经大体了解了@property的参数,今天我们就来详细解释一下@property关于内存管理的用法。
首先,我们来新建两个类,Book和Student类
Student.h
#import <Foundation/Foundation.h> #import "Book.h" @interface Student :NSObject @property Book *book; @end
#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
#import "Book.h" @implementation Book - (void)dealloc{ NSLog(@"book %f 被销毁了", price); [super dealloc];} @end
所以我们又在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]; } }
剩下的参数用法也很简单,我就不一一详细列举了,简单提一下atomic和nonatomic
atomic
保证多线程访问下的安全, 但浪费系统资源, 原子性控制的默认设置.
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