在Objective-C中,@是Objective-C的標志,證明您正在使用Objective-C語言!
針對Objective-C語言中的關鍵詞@property與@synthesize的使用進行了一個簡要的分析(自己所理解的).
下面是自己編寫的一個例子:建立一個Person類,其中省略了方法的聲明.
1)在.h頭文件中:
@property在頭文件中應用于聲明:
例如:
@property NSInteger age;
編譯器會自動在.h頭文件中聲明了2個方法:(setter,getter方法)
- (NSInteger)age; ? ? ?- (void)setAge:(NSInteger)age;
2)在.m實現(xiàn)文件中:
@sythesize在.m實現(xiàn)文件中應用于實現(xiàn):
例如:
@synthesize age = _age;?
編譯器會自動在.m文件中實現(xiàn)2個方法:(setter,getter方法)
- (void)setAge:(NSInteger)age
{
? ? ? ? ? ?_age ?= ?age;
}
- (NSInteger)age
{
? ? ? ? ? ?return ? _age;
}
請注意:
在Xcode4.5以后的版本中,可以省略@synthesize,編譯器會自動添加getter和setter方法的聲明和實現(xiàn),同時會默認訪問_age這個成員變量,如果找不到這個變量,會自動生成_age的私有成員變量.
3)@property語法的寫法:
例如:
@property(nonatomic, retain) NSString *name;
@property(nonatomic, copy)NSString *gender;
其中在@property后的()括號中的參數如下:(以及其意義)
readwrite:可以產生和使用getter和setter方法.
readonly:只產生和使用getter方法,不能產生和使用setter方法.
assign:默認類型,在setter中直接進行賦值使用的,不進行retain操作
retain:setter方法中,對參數進行release釋放舊值,再retain新值.釋放舊對象,將舊對象的值賦予輸入對象,再提高輸入對象的引用計數為1.
copy:setter方法進行copy操作,與retain一樣, 建立一個引用計數為1的對象,然后釋放舊對象
nonatomic:禁止多線程鸠蚪,變量保護,提高性能
atomic:系統(tǒng)默認,這個屬性是為了保證程序在多線程情況肤频,編譯器會自動生成一些互斥加鎖代碼击喂,避免該變量的讀寫不同步問題。
strong:強引用,也是我們通常說的引用,其存亡直接決定了所指向對象的存亡,如果不存在指向一個對象的引用,并且此對象不再顯示在列表中,則此對象會被從內存中釋放.
weak:弱引用,不決定對象的存亡,即使一個對象被持有無數個弱引用,只要沒有強引用指向它,那么還是會被清除
setter=: 對setter方法重新定義一個名字.
getter=: 對getter方法重新定義一個名字.
據上述所說的參數類型中,copy和retain是最為復雜的,下面就這兩項進行一個簡要的分析:
retain:
例如:
@property(nonatomic, retain) NSString *name;
1)setter方法分析:
- (void)setName:(NSString *)name
{
? ? if ( _name != name) { ? //判斷是否與舊值相同
? ? ? ? ?[ _name ?release ]; ?//若新值與舊值不同則將舊值釋放
? ? ? ? _name = [ name retain ]; ?//賦予新值,此時的引用計數+1
? ? ? }
}
2)getter方法分析:
- (NSString *)name
{
return [ [ _name retain ] ?autorelease ];
}
copy:
例如:
@property(nonatomic, copy)NSString *gender;
1)setter方法如下:
- (void)setGender:(NSString *)gender
{
? ? if ( _gender != gender) { //判斷是否與舊值一樣
? ? ? ? [ _gender ? release ] ; ? ?//釋放舊值
? ? ? ? _gender = [ gender copy ]; ?//進行對原值的拷貝,開辟新的空間,將地址拷貝,并將新的空間的引用計數+1
? ? ? }
?}
2)getter方法如下:
- (NSString *)gender
{
? ? ? ?return ?[ _gender retain ] autorelease ];
}
注意:
1)nonatomic:如果使用多線程论笔,有時會出現(xiàn)兩個線程互相等待對方導致鎖死的情況(具體可以搜下線程方面的注意事項去了解)采郎。在沒有(nonatomic)的情況下,即默認(atomic)狂魔,會防止這種線程互斥出現(xiàn)蒜埋,但是會消耗一定的資源。所以如果不是多線程的程序最楷,打上(nonatomic)即可
2)Objective-C語言,系統(tǒng)默認是ARC模式,所以不論是copy或者retain中的setter和getter,通過@synthesize自動生成getter和setter方法.