您的位置:首页 > 移动开发 > Objective-C

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

#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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息