IOS开发基础Object-C(09)—OC内存管理(3)-@property的参数详解

在 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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章