在 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
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
禁止多线程,变量保护,提高性能
附@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