在 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