Objective-c中的@Property

@property是什么

@Property是聲明屬性的語法劳跃,它可以快速方便的為實例變量創(chuàng)建存取器名船,并允許我們通過點語法使用存取器诈茧。

存取器(accessor):指用于獲取和設(shè)置實例變量的方法。用于獲取實例變量值的存取器是getter纺念,用于設(shè)置實例變量值的存取器是setter贝椿。

創(chuàng)建存取器

手工創(chuàng)建存取器

我們先看兩段代碼:

//Fraction.h
#import <Foundation/Foundation.h>
@interface Fraction:NSObject
{
int numerator;
int denominator;
}
-(void) print;
-(void) setNumerator: (int) n;
-(void) setDenominator: (int) d;
-(int) numerator;
-(int) denominator;
-(double) convertToNum;

上面代碼中numerator、denominator是Fraction類的實例變量陷谱,并且看到對這兩個實例變量都聲明了set/get方法烙博。

//Fraction.m
#import "Fraction.h"
@implementation Fraction
-(void) print
{ 
  NSlog (@"%i/%i", numerator, denominator);
}

-(void) setNumerator: (int) n
{
  numerator=n;
}

-(void) setDenominator: (int) d
{
  denominator=d;
}

-(int) numerator
{
  return numerator;
}

-(int) denominator
{
  return denominator;
}

-(double) convertToNum
{
  if (denominator != 0)
    return (double) numerator / denominator;
  else
    return 1.0;
}
@end

上面代碼是對實例變量存取器的實現(xiàn)。我們可以看到烟逊,存取器就是對實例變量進(jìn)行賦值和取值渣窜。按照約定賦值方法以set開頭,取值方法以實例變量名命名焙格。

使用@Property創(chuàng)建存儲器

@interface Fraction:NSObject
{
int numerator;
int denominator;
}
@property int numerator, denominator;
-(void) print;
-(double) convertToNum;

上面代碼中图毕,我們使用@property聲明兩個屬性,名稱與實例變量名稱相同眷唉。

@implementation Fraction
@synthesize numerator, denominator;
-(void) print
{ 
  NSlog (@"%i/%i", numerator, denominator);
}
-(double) convertToNum
{
  if (denominator != 0)
    return (double) numerator / denominator;
  else
    return 1.0;
}
@end

和手動生成存取器相比予颤,在.m文件中我們使用@synthesize自動生成這兩個實例變量的存取器,并且隱藏了存取器冬阳,雖然我們看不到存取器蛤虐,但它們確實是存在的。

總結(jié):
@property等同于在.h文件中聲明實例變量的get/set方法肝陪,@synthesize等同于在.m文件中實現(xiàn)實例變量的get/set方法驳庭。使用@property和synthesize創(chuàng)建存取器要比手動聲明兩個存取方法(getter和setter)更簡單。而且我們在使用屬性時可以使用點語法賦值或取值氯窍,語法更簡單饲常,更符合面向?qū)ο缶幊獭?/p>

不必單獨聲明實例變量

如果我們希望使用默認(rèn)的實例變量命名方式,那么我們在.m文件中就不需要使用@synthesize聲明狼讨,系統(tǒng)會幫我們自動完成(以“_實例變量名字”來命名)贝淤。

@synthesize numerator = _numerator;
@synthesize denominator = _denominator;

如果我們希望自己命名實例變量命,那么我們就使用@synthesize顯示聲明我們希望的實例變量名政供。

@property的特性

@property還有一些關(guān)鍵字播聪,它們都是有特殊作用的,比如上述代碼中的nonatomic布隔,strong离陶。
把它們分為三類,分別是:原子性衅檀,存取器控制招刨,內(nèi)存管理

原子性

atomic(默認(rèn)):atomic意為操作是原子的哀军,意味著只有一個線程訪問實例變量计济。atomic是線程安全的,至少在當(dāng)前的存取器上是安全的排苍。它是一個默認(rèn)的特性沦寂,但是很少使用,因為比較影響效率淘衙,這跟ARM平臺和內(nèi)部鎖機制有關(guān)传藏。
nonatomic:nonatomic跟atomic剛好相反。表示非原子的彤守,可以被多個線程訪問毯侦。它的效率比atomic快。但不能保證在多線程環(huán)境下的安全性具垫,在單線程和明確只有一個線程訪問的情況下廣泛使用侈离。

存取器的控制

readwrite(默認(rèn)):readwrite是默認(rèn)值,表示該屬性同時擁有setter和getter筝蚕。
readonly: readonly表示只有g(shù)etter沒有setter卦碾。

內(nèi)存管理

主要涉及到assign铺坞、retain、strong洲胖、weak济榨、copy等情況,以及各自的使用場景绿映。
Strong:強引用擒滑,表示實例對象對傳入的對象有所有權(quán)關(guān)系。常用在:自定義對象叉弦,控制器對象丐一。
Weak:弱引用,在setter方法中淹冰,需要對傳入的對象不進(jìn)行引用計數(shù)加1的操作库车,也就是,對傳入的對象沒有所有權(quán)榄棵,當(dāng)該對象的引用計數(shù)為0時凝颇,該對象即被釋放,用weak聲明的實例變量指向nil疹鳄,即實例變量的值為0拧略。常用在:delegate對象,IBOutLet瘪弓。
Assign:簡單賦值垫蛆,不改變引用計數(shù),適合簡單數(shù)據(jù)類型如NSInteger腺怯、CGFloat袱饭、int、float等呛占。
Copy:把原來的對象完整復(fù)制另外一個地方虑乖,重新加載內(nèi)存區(qū),原來對象變了不影響新內(nèi)存區(qū)的對象晾虑。常用在:NSString疹味、NSArray、NSDictionary及其子類等帜篇。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末糙捺,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子笙隙,更是在濱河造成了極大的恐慌洪灯,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,348評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件竟痰,死亡現(xiàn)場離奇詭異签钩,居然都是意外死亡掏呼,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評論 2 385
  • 文/潘曉璐 我一進(jìn)店門边臼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來哄尔,“玉大人假消,你說我怎么就攤上這事柠并。” “怎么了富拗?”我有些...
    開封第一講書人閱讀 156,936評論 0 347
  • 文/不壞的土叔 我叫張陵臼予,是天一觀的道長。 經(jīng)常有香客問我啃沪,道長粘拾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,427評論 1 283
  • 正文 為了忘掉前任创千,我火速辦了婚禮缰雇,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘追驴。我一直安慰自己械哟,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,467評論 6 385
  • 文/花漫 我一把揭開白布殿雪。 她就那樣靜靜地躺著暇咆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪丙曙。 梳的紋絲不亂的頭發(fā)上爸业,一...
    開封第一講書人閱讀 49,785評論 1 290
  • 那天,我揣著相機與錄音亏镰,去河邊找鬼扯旷。 笑死,一個胖子當(dāng)著我的面吹牛索抓,可吹牛的內(nèi)容都是我干的钧忽。 我是一名探鬼主播,決...
    沈念sama閱讀 38,931評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼纸兔,長吁一口氣:“原來是場噩夢啊……” “哼惰瓜!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起汉矿,我...
    開封第一講書人閱讀 37,696評論 0 266
  • 序言:老撾萬榮一對情侶失蹤崎坊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后洲拇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體奈揍,經(jīng)...
    沈念sama閱讀 44,141評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡曲尸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,483評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了男翰。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片另患。...
    茶點故事閱讀 38,625評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蛾绎,靈堂內(nèi)的尸體忽然破棺而出昆箕,到底是詐尸還是另有隱情,我是刑警寧澤租冠,帶...
    沈念sama閱讀 34,291評論 4 329
  • 正文 年R本政府宣布鹏倘,位于F島的核電站,受9級特大地震影響顽爹,放射性物質(zhì)發(fā)生泄漏纤泵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,892評論 3 312
  • 文/蒙蒙 一镜粤、第九天 我趴在偏房一處隱蔽的房頂上張望捏题。 院中可真熱鬧,春花似錦肉渴、人聲如沸公荧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽稚矿。三九已至,卻和暖如春捻浦,著一層夾襖步出監(jiān)牢的瞬間晤揣,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工朱灿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留昧识,地道東北人。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓盗扒,卻偏偏與公主長得像跪楞,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子侣灶,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,492評論 2 348

推薦閱讀更多精彩內(nèi)容