ARC 屬性@property(總結(jié)《Effective Objective-C 2.0》)

屬性特質(zhì)分為4種

1掀虎、原子性

2、讀寫權(quán)限

3十气、內(nèi)存管理語義

4春霍、方法名

</br>
1砸西、原子性(2種)
(1)atomic(默認(rèn))
(2)nonatomic

2址儒、讀寫權(quán)限(2種)
(1)readwrite(默認(rèn))
(2)readonly

3、內(nèi)存管理語義(5種) ——這組特質(zhì)僅會影響“設(shè)置方法”莲趣,即setter
(1)assgin (非對象類型默認(rèn)屬性,相當(dāng)于unsafe_unretained走芋,適用于int绩郎、float翁逞、CGFloat、NSInteger等)
(2)unsafe_unretained (對象類型默認(rèn)屬性状植,相當(dāng)于assgin怨喘,適用于NSObject津畸、NSArray必怜,NSDictionary等)
(3)weak
(4)strong
(5)copy

4、方法名
(1)編譯器會自動生成屬性存取方法(默認(rèn))
(2)getter = <取值方法名>
(3)setter = <設(shè)置方法名>

比如帝簇,自己寫了一個屬性name

@property (strong, nonatomic) NSString *name;

以下2個方法將自動生成,但不會在編輯器Xcode里面看到:

- (void)setName: (NSString *)name {
    ...
}

- (NSString *)name {
    ...
}

如果不想要默認(rèn)的存取方法名丧肴,就可以使用這個特質(zhì)寫一個自定義的方法名:

@property (strong, nonatomic, setter=setMyName) NSString *name;

這樣設(shè)置方法名就會變成下面這樣

- (void)setMyName: (NSString *)name {
    ...
}

同理胧后,在屬性特質(zhì)中加入 getter = xxx 可自定義取值方法。

我們可以同時把4種特質(zhì)都用上壳快,像下面這樣:

@property (nonatomic, readwrite, strong, getter=myName, setter=setMyName) *name;

</br>

特質(zhì)在確定屬性需求時最好顯式指定,便于自己和他人理解其語義

除以下特殊情況外:讀寫權(quán)限為readwrite時可省略瘤旨。

如果需要一個nonatomic,readwrite存哲,unsafe_unretained七婴,使用默認(rèn)存取方法的name屬性

不推薦的寫法:

@property (nonatomic) NSString *name;

推薦的寫法:

@property (nonatomic, unsafe_unretained) NSString *name;

</br>

每個屬性特質(zhì)適用情景

1、原子性

atomic:

在iOS開發(fā)中幾乎不用打厘,有性能問題;Mac OS X開發(fā)可用嵌施。對象和非對象都能用饲化。

nonatomic:

在iOS開發(fā)中幾乎要用到艰管。對象和非對象都能用。

2、讀寫權(quán)限

readwrite:

屬性擁有g(shù)etter和setter捺球。

readonly:

屬性只有g(shù)etter,讀操作會被視為非法裂逐。

如果要對外公開屬性為只讀,對內(nèi)進(jìn)行讀寫泣栈,可以這么做:

//Person.h
@interface Person: NSObject
@property (nonatomic, readonly, copy) NSString *firstName;
@property (nonatomic, readonly, copy) NSString *lastName;

@end
//Person.m
@interface Person () {
@property (nonatomic, readwrite, copy) NSString *firstName;
@property (nonatomic, readwrite, copy) NSString *lastName;
}

@implementation Person

@end

在實現(xiàn)文件中Person類分類定義了firstName和lastName的讀寫權(quán)限是readwrite南片,所以可以在實現(xiàn)文件內(nèi)部修改它們掺涛。但在外部看來疼进,它們是不可寫的。

3拣帽、內(nèi)存管理語義(“持有”嚼锄、“保留”、“釋放”等概念均源于MRC)

assign:

非對象類型唯一可用內(nèi)存管理語義区丑。你不用就沒得用了。

unsafe_unretained:

非持有關(guān)系(不保留刊苍,"unretained")。意思是啥纸,為這種屬性設(shè)置新值時婴氮,設(shè)置方法既不會保留新值盾致,也不釋放舊值荣暮。當(dāng)目標(biāo)對象被銷毀時,屬性值不會自動清空(不安全穗酥,"unsafe")。

weak:

非持有關(guān)系砾跃。意思是,為這種屬性設(shè)置新值時判耕,設(shè)置方法既不會保留新值翘骂,也不釋放舊值。當(dāng)目標(biāo)對象被銷毀時碳竟,屬性值會自動清空(置為nil)。

strong:

持有關(guān)系方仿。意思是统翩,為這種屬性設(shè)置新值時仙蚜,設(shè)置方法會先保留新值厂汗,再釋放舊值,然后設(shè)置新值贾节。

copy:

用來保護(hù)屬性的封裝性衷畦。使用了copy,等于給設(shè)置方法加了一條copy語句祈争。

沒有使用copy的設(shè)置方法:

- (void)setName: (NSString *)name {
    _name = name;
}

使用了copy的設(shè)置方法:

- (void)setName: (NSString *)name {
    _name = [name copy];
}

如何保護(hù)?設(shè)置方法會遇到2種情況忿墅,還是用屬性name的例子來說明
第一種情況,設(shè)置方法傳入的是一個不可變字符串:

- (void)setName: (NSString *)name {
    _name = [name copy];
}

設(shè)置方法的參數(shù)name是一個NSString類型疚脐。對NSString類型發(fā)送copy消息,是淺復(fù)制望薄,只復(fù)制了指針照卦,_name和參數(shù)name指向同一個地址。這種情況可以說strong與copy無異役耕,它相當(dāng)于執(zhí)行下面這個方法:

- (void)setName: (NSString *)name {
    _name = name;
}

第二種情況聪廉,設(shè)置方法傳入的是一個可變字符串:

- (void)setName: (NSString *)name {
    _name = [name copy];
}

設(shè)置方法的參數(shù)name是一個NSMutableString類型。因為NSMutableString是NSString的子類板熊,合法。對NSMutableString類型發(fā)送copy消息津辩,是深復(fù)制容劳。_name和參數(shù)name指向不同的地址。這樣你在外部修改了參數(shù)name竭贩,_name也不會變,這就保護(hù)了_name的封裝性窄赋。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末楼熄,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子可岂,更是在濱河造成了極大的恐慌,老刑警劉巖伐债,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異萎馅,居然都是意外死亡虹蒋,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進(jìn)店門魄衅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人皆撩,你說我怎么就攤上這事哲银。” “怎么了荆责?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長盲泛。 經(jīng)常有香客問我键耕,道長,這世上最難降的妖魔是什么郁竟? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任棚亩,我火速辦了婚禮蓖议,結(jié)果婚禮上讥蟆,老公的妹妹穿的比我還像新娘。我一直安慰自己修然,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布愕宋。 她就那樣靜靜地躺著,像睡著了一般囤捻。 火紅的嫁衣襯著肌膚如雪邻寿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天绣否,我揣著相機(jī)與錄音,去河邊找鬼暴构。 笑死段磨,一個胖子當(dāng)著我的面吹牛丹壕,可吹牛的內(nèi)容都是我干的薇溃。 我是一名探鬼主播缭乘,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼堕绩,長吁一口氣:“原來是場噩夢啊……” “哼策幼!你這毒婦竟也來了奴紧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤唐含,失蹤者是張志新(化名)和其女友劉穎沫浆,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體专执,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年桐腌,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片案站。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡涩笤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蹬碧,到底是詐尸還是另有隱情,我是刑警寧澤誊稚,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布罗心,位于F島的核電站,受9級特大地震影響渤闷,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜飒箭,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一弦蹂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧凸椿,春花似錦、人聲如沸脑漫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽劈伴。三九已至握爷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間新啼,已是汗流浹背刹碾。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留迷帜,地道東北人。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓冠胯,卻偏偏與公主長得像锦针,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子奈搜,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,685評論 2 360

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