一、@property和@synthesize的用途:xcode
@property、@synthesize用於自動生成類成員變量的存取方法(setter方法和getter方法)。多線程
@property用在頭文件裏邊,而@synthesize用於源文件裏邊。( xcode4.5以及之後的版本,@synthesize能夠省略)atom
在默認狀況下,當源文件裏邊沒有實現setter和getter方法時,經過synthysize能夠自動生成標準的setter和getter方法。注意:經過synthysize實現的setter和getter都是原子性訪問的。多線程同時訪問時,保障訪問方法同時只能被一個線程訪問。spa
如:
線程
(1)YtsStudent.h:code
#import <Foundation/Foundation.h> @interface Student : NSObject { int _age; int _no; } @property int age; @property int no; @end
(2)YtsStudent:m對象
#import "Student.h" @implementation Student @synthesize age=_age, no=_no,name; //由於代碼中沒有定義成員變量name,因此係統將自動生成一個成員變量name。 @end
二、@property的聲明列表主要包括:內存
1.聲明屬性的訪問方法:get
getter=getterNameit
setter=setterName
聲明訪問屬性的設置與獲取方法名。
2.聲明屬性的寫操做權限
readwrite -- 聲明屬性爲讀寫屬性,便可訪問setter方法,也能夠訪問getter方法,與readonly互斥。
readonly -- 聲明屬性爲只讀屬性,只能訪問getter方法(即只自動生成getter方法),與readwrite互斥。
3.聲明寫方法的實現
assign -- 聲明在setter方法中,採起直接賦值來實現設置操做。
效果如:
-(void)setName:(NSString *)_name{ name =_name; }
retain -- 聲明在setter方法中,須要對設置的值進行retain加1操做。
效果如:
-(void)setName:(NSString *)_name{ if(name!=_name){ [name release]; name = [_name retain] } }
copy -- 指定應該使用對象的副本(深度拷貝),對原值發送一條release消息,而後再copy。基本上像retain,可是沒有增長引用計數,是分配一塊新的內存來放置它。
效果如:
-(void)setName:(NSString *)_name{ if(name!=_name){ [name release]; name = [_name copy] } }
注意:
(1)assign、retain、copy在使用上的區別:
若是將一個對象賦給某成員變量,那麼使用retain時,當外面的對象改變,則成員變量的值也會改變;
若是使用copy,由於是拷貝產生了新的對象,因此name不會改變。
建議:
(1)使用assign : 基礎數據類型(NSInteger,CGFloat)和C數據類型(int, float, double, char等等)。
(2)使用copy : NSString。
(3)使用retain : 其餘NSObject和其子類。
4. 聲明方法的原子性
nonatomic -- 設置屬性的訪問爲非原子性訪問。
在默認狀況下,經過synthysize實現的setter和getter都是原子性訪問的。多線程同時訪問時,保障訪問方法同時只能被一個線程訪問。