Objective-C屬性關鍵字淺析(下)

本文搬運自黑馬社區原文小飛機直達

前文說道:關于屬性的創建以及部分關鍵字的解釋與區別,進行了一定程度上的解釋。
具體可以查看:Objective-C屬性關鍵字淺析(上)
本文會繼續闡述一些跟屬性關鍵字有關的一些技術點。

一、@synthesize 和 @dynamic 分別有什么作用?

@property 有兩個對應的詞,一個是@synthesize,一個是@dynamic。
如果@synthesize 和@dynamic 都沒寫,那么默認的就是

@syntheszie var = _var;

@synthesize 的語義是如果你沒有手動實現 setter 方法和 getter 方法,那么編譯器會自動為你加上這兩個方法。
@dynamic 告訴編譯器:屬性的 setter 與 getter 方法由用戶自己實現,不自動生成。(當然對于 readonly 的屬性只需提供 getter 即可)
假如一個屬性被聲明為
@dynamic var;
然后你沒有提供@setter 方法和@getter 方法,編譯的時候沒問題,但是當程序運行到 instance.var = someVar,由于缺 setter方法會導致程序崩潰;
或者當運行到 someVar = instance.var 時,由于缺 getter 方法同樣會導致崩潰。

編譯時沒問題,運行時才執行相應的方法,這就是所謂的動態綁定

二、ARC 下,不顯式指定任何屬性關鍵字時,默認的關鍵字都有哪些?

基本數據:atomic,readwrite,assign

普通的 OC 對象:atomic,readwrite,strong

三、@synthesize 合成實例變量的規則是什么?假如 property 名為 foo,存在一個名為_foo 的實例變量,那么還會自動合成新變量么?

先回答第二個問題:不會!!!不會!!!不會!!!

@synthesize 合成成員變量的規則,有以下幾點:
如果指定了成員變量的名稱,會生成一個指定的名稱的成員變量如果這個成員已經存在了就不再生成了。
如果指定@synthesize foo;就會生成一個名稱為 foo 的成員變量,也就是說:會自動生成一個屬性同名的成員變量。

@interface XMGPerson:NSObject
@property (nonatomic, assign) int age;
@end
@implementation XMGPerson
// 不加這語句默認生成的成員變量名為_age
// 如果加上這一句就會生成一個跟屬性名同名的成員變量 

如果是 @synthesize foo = _foo; 就不會生成成員變量了

四、在有了自動合成屬性實例變量之后,@synthesize 還有哪些使用場景?

首先的搞清楚什么情況下不會 autosynthesis(自動合成):

  1. 同時重寫了setter和getter時
  2. 重寫了只讀屬性的getter時
  3. 使用了@dynamic時

在 @protocol 中定義的所有屬性在 category 中定義的所有屬性重載的屬性,當你在子類中重載了父類中的屬性,必須使用@synthesize 來手動合成ivar。
應用場景:
當你同時重寫了 setter 和 getter 時,系統就不會生成 ivar。這時候有兩種選擇手動創建ivar

  1. 使用@synthesize foo = _foo
  2. 關聯@property與ivar可以用來修改成員變量名,一般不建議這么做,建議使用系統自動生成的成員變量

五、 怎么用copy關鍵字?

NSString、NSArray、NSDictionary等等經常使用copy關鍵字,是因為他們有對應的可變類型:NSMutableString、NSMutableArray、NSMutableDictionary。
為確保對象中的屬性值不會無意間變動,應該在設置新屬性知識拷貝一份,保護其封裝性block,也經常使用copy,關鍵字block。

使用 copy 是從 MRC 遺留下來的“傳統”,在 MRC 中,方法內部的 block 是在棧區的,使用 copy 可以把它放到堆區.
在 ARC 中寫不寫都行:對于 block 使用 copy 還是 strong 效果是一樣的,但是建議寫上 copy,因為這樣顯示告知調用者“編譯器會自動對 block 進行了 copy 操作。"

六、用@property 聲明的 NSString(或 NSArray,NSDictionary)經常使用 copy 關鍵字,為什么?如果改用 strong 關鍵字,可能造成什么問題?

因為父類指針可以指向子類對象,使用 copy 的目的是為了讓本對象的屬性不受外界影響,使用 copy 無論給我傳入是一個可變對象還是不可對象,我本身持有的就是一個不可變的副本.
如果我們使用是 strong,那么這個屬性就有可能指向一個可變對象,如果這個可變對象在外部被修改了,那么會影響該屬性.

屬性 內容
淺復制(shallow copy) 在淺復制操作時,對于被復制對象的每一層都是指針復制。
深復制(one-level-deep copy) 在深復制操作時,對于被復制對象,至少有一層是深復制。
完全復制(real-deep copy) 在完全復制操作時,對于被復制對象的每一層都是對象復制。

復制詳解:

屬性 內容
淺復制(shallow copy) 在淺復制操作時,對于被復制對象的每一層都是指針復制。
深復制(one-level-deep copy) 在深復制操作時,對于被復制對象,至少有一層是深復制。
完全復制(real-deep copy) 在完全復制操作時,對于被復制對象的每一層都是對象復制。

非集合類對象的 copy 與 mutableCopy

[不可變對象 copy] // 淺復制 
[不可變對象 mutableCopy] //深復制
[可變對象 copy] //深復制 
[可變對象 mutableCopy] //深復制

類對象的 copy 與 mutableCopy

[不可變對象 copy] // 淺復制 
[不可變對象 mutableCopy] //單層深復制
[可變對象 copy] //單層深復制
[可變對象 mutableCopy] //單層深復

這里需要注意的時集合對象的內容復制僅限于對象本身,對象元素仍然是指針復制。

七、 這個寫法會出什么問題?:@property(copy)NSMutableArray *array;

因為 copy 策略拷貝出來的是一個不可變對象,然而卻把它當成可變對象使用,很容易造成程序奔潰這里還有一個問題,該屬性使用了同步鎖,會在創建時生成一些額外的代碼用于幫助編寫多線程程序,這會帶來性能問題,通過聲明 nonatomic 可以節省這些雖然
很小但是不必要額外開銷,在 iOS 開發中應該使用 nonatomic 替代 atomic.

八、如何讓自定義類可以用 copy 修飾符?如何重寫帶 copy 關鍵字的 setter?

若想令自己所寫的對象具有拷貝功能,則需實現NSCopying協議。如果自定義的對象分為可變版本與不可變版本,那么就要同時實現NSCopying和NSMutableCopying協議,不過一般沒什么必要,實現NSCopying協議就夠了

// 實現不可變版本拷貝
- (id)copyWithZone:(NSZone *)zone; // 實現可變版本拷貝
- (id)mutableCopyWithZone:(NSZone *)zone;
// 重寫帶 copy 關鍵字的 setter
- (void)setName:(NSString *)name {
    _name = [name copy];
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,321評論 6 543
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,559評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,442評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,835評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,581評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,922評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,931評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,096評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,639評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,374評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,591評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,104評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,789評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,196評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,524評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,322評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,554評論 2 379

推薦閱讀更多精彩內容

  • 1 初見夏木那是在高二的一個學期里。原本她是普通班的一員,但就是在那個學期里,她已剛剛過重點班分數線的分數,進了這...
    夏木月閱讀 594評論 1 2
  • 大部分人包括我自己拼命奔向每天進步一點點,已經自認為超過身邊很多人了,當看到笑來老師說保持成長率時,不禁倍受打擊,...
    問之成兮閱讀 139評論 0 0
  • 雪,把圣潔的花瓣布滿村落 吹煙都被裹住似的 院落的果樹依然挺撥 變紫變黃 各顯百態……
    漠中閱讀 172評論 0 3
  • 小學生作文
    高翡閱讀 163評論 0 0
  • 最近在看特立獨行的貓的這本小說,不要讓未來的你討厭現在的自己。在經歷了學校生活之后,一出校門,一點點的挫折就會讓我...
    Raliae閱讀 162評論 2 1