屬性

概述

適用:Objective-C 2.0中引入了屬性(property),只適用于Mac OS X10.5以上的版本次员。

修飾符用法

assign修飾符用來修飾值類型和id類型(一般是delegate)的屬性檀训,需要注意的是如果id類型的屬性的修飾符用了assign,當你不需要這個屬性時埂软,你必須將delegate手動置空锈遥,防止野指針產(chǎn)生,這也是為什么 delegate 一般都用 weak 修飾的原因仰美。
weak 和 strong 是 ARC 的產(chǎn)物迷殿,分別表示弱引用類型和強引用類 型。在給 strong 修飾的屬性賦值時咖杂,會將屬性的指針指向新值的地址庆寺,同時持有這個新值(新值的引用計數(shù)被加1)。在給 weak 修飾的屬性賦值時诉字,只是簡單地將屬性的指針指向新值的地址懦尝,不會持有新值。
retain 在 ARC 下基本等同于 strong壤圃。
copy 表示強引用陵霉,但是不會持有新值,而是拷貝一份引用計數(shù)為1的值給屬性伍绳。給這種修飾符修飾的屬性賦值時踊挠,實際上是把 新值調(diào)用 copy 方法后的返回值 賦給屬性。NSString 類型常常用 copy 修飾,就是防止修改某個對象后效床,對強引用這個對象的屬性造成不必要影響睹酌。
引用類型默認的修飾符是 strong.
值類型的默認修飾符是 assign.

原風格

{
    float rainHandling;
    float snowHandling;
}
- (void)setRainHandling: (float) rainHanding;
- (float) rainHandling;
- (void) setSnowHandling: (float) snowHandling;
- (float) snowHandling;

屬性風格

{
    float rainHandling;
    float snowHandling;
}
@property float ranHanding;
@property float snowHandling;

說明:@prorerty 預編譯指令的作用是自動聲明屬性的setter和getter方法。屬性的名稱不必與實例變量的名稱相同剩檀。憋沿,但大多數(shù)情況下它們是一樣的。

.m文件下的修改

@synthesize rainHandling;
@synthesize snowHandling;
@synthesize表示”創(chuàng)建了該屬性的訪問代碼“(在Xcode4.5以后的版本沪猴,可以不必使用@synthesize了)

實例變量不是必須的

需要注意頭文件中有兩個叫做rainHandling和snowHandling的實例變量(合成的setter和getter方法會用到這些變量)辐啄。如果你沒有聲明這些變量,編譯器也會聲明的运嗜。

點表達式的妙用

[tire setRainHandling:20+i];
[tire setSnowHandling:28+i];
=
tire.rainHandling = 20+i;
tire.snowHandling = 28+i;

[trie rainHandling],[trie snowHandling]
=
trie.rainHandling,trie.snowHandling

如果點表達式出現(xiàn)在了等號的左邊壶辜,該變量名稱的setter方法被調(diào)用;如果點表達式出現(xiàn)在了等號的右邊洗出,則該變量名稱的getter方法被調(diào)用士复。

屬性擴展

屬性同樣適用于int、char翩活、BOOL和struct類型。甚至可以定義一個NSRect對象的屬性便贵。
不過對象也會帶來一些麻煩菠镇。我們在適用訪問方法對象時需要保留和釋放對象。對于某些對象的值承璃,尤其是字符串的值利耍,你總是會復制(-copy)它們。而對于其他對象的值盔粹,如委托隘梨,你根本不會想要保留它們。
為什么要復制對象舷嗡?
你想要復制的字符串參數(shù)轴猎。一種常見的錯誤就是從用戶界面(如文本框)中獲得一個字符串,并將其作為某事物的名稱使用进萄。文本框中的字符串通常都是可變字符串捻脖,復制該字符串可以防止因意外的變換而產(chǎn)生不利的影響。

原風格

  - (id)init
{    
   name = [[NSString alloc] initWithString:@"Car"];
}

- (void)setName:(NSString *)newName
{
   [name release];
   name = [newName copy];
} //setName
- (NSString *)name
{
   return (name);
}//name
- (void)dealloc
{
   [name release]
}

屬性風格

@property (copy) NSString *name;
@property (retain) Engine *engine;//engine屬性使用的只有保留和釋放特性
  • 如果copy和retain都沒有使用的話中鼠,默認為使用assign可婶。
  • 如果你不想保留某個變量對象,可以使用assign援雇,這樣可以避免發(fā)生保留死循環(huán)矛渴。
  • nonatomic 可以在非多線程中使用,可以了提高訪問放的調(diào)用速度
  • 系統(tǒng)默認為nonatomic和assign惫搏。你可以為可保留的指針(Objective-C對象)指定retain和copy特性具温。而其他C類型和不可保留的指定必須使用assign特性并且要手動來管理內(nèi)存蚕涤。
  • 如果自己定義setter或getter方法,那么就不能使用atomic特性了桂躏,必須使用nonatomic特性钻趋。

名稱的使用

.h中
{
    NSString *appellation;
    Engine *engine;
}
@property (copy) NSString *name;
@property (retain) Engine *engine;
.m中
@synthesize name = appellation;
編譯器扔將創(chuàng)建-setName:和-name方法,但在實現(xiàn)代碼中用的卻是appellation實例變量剂习。

只讀屬性

系統(tǒng)默認是readwrite蛮位,假設(shè)我們不想讓任何人修改它,可以設(shè)置屬性為readonly

  • @property (readonly) float shoeSize;
    當編譯器知道這個@property屬性是只讀的鳞绕,它將只生成一個getter方法而不會生成setter方法失仁。調(diào)用set方法會報錯,點語法也同樣们何。

不要變量萄焦、getter和setter方法

@dynamic 不生成任何代碼或創(chuàng)建相應的實例變量。
創(chuàng)建一個能在運行時計算此值的訪問方法冤竹,不能set這個值拂封。

@property (readonly) float bodyMassIndex;
- (float)bodyMassIndex;
- (float)bodyMassIndex
{
    //compute and return bodyMassIndex
}

換個名字(getter= | setter=)

@property (getter=isHidden) BOOL hidden;
它告訴編譯器生成名為isHidden的getter方法,并生成名為默認setHidden:的setter方法

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鹦蠕,一起剝皮案震驚了整個濱河市冒签,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌钟病,老刑警劉巖萧恕,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異肠阱,居然都是意外死亡票唆,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門屹徘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來走趋,“玉大人,你說我怎么就攤上這事缘回∵菏樱” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵酥宴,是天一觀的道長啦吧。 經(jīng)常有香客問我,道長拙寡,這世上最難降的妖魔是什么授滓? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上般堆,老公的妹妹穿的比我還像新娘在孝。我一直安慰自己,他們只是感情好淮摔,可當我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布私沮。 她就那樣靜靜地躺著,像睡著了一般和橙。 火紅的嫁衣襯著肌膚如雪仔燕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天魔招,我揣著相機與錄音晰搀,去河邊找鬼。 笑死办斑,一個胖子當著我的面吹牛外恕,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播乡翅,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼鳞疲,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蠕蚜?” 一聲冷哼從身側(cè)響起建丧,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎波势,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體橄维,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡尺铣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了争舞。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片凛忿。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖竞川,靈堂內(nèi)的尸體忽然破棺而出店溢,到底是詐尸還是另有隱情,我是刑警寧澤委乌,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布床牧,位于F島的核電站,受9級特大地震影響遭贸,放射性物質(zhì)發(fā)生泄漏戈咳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望著蛙。 院中可真熱鬧删铃,春花似錦、人聲如沸踏堡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽顷蟆。三九已至诫隅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間慕的,已是汗流浹背阎肝。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留肮街,地道東北人风题。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像嫉父,于是被迫代替她去往敵國和親沛硅。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,611評論 2 353

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