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


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