知識(shí)點(diǎn):可變數(shù)組的屬性使用copy修飾的后果

image

問題

視頻What's New in LLVM
中,從12:05的時(shí)間開始有個(gè)關(guān)于NSMutableArray可變數(shù)組屬性的使用問題裕便。

image

運(yùn)行后報(bào)錯(cuò)圖如下:


image

分析

self.photos的實(shí)際類型是 __NSMutable0,也就NSArray類型。沒有addObject的方法餐抢。

進(jìn)一步探討

  1. OC是門動(dòng)態(tài)型語言,在編譯階段不會(huì)做類型檢測低匙。OC的內(nèi)存管理是引用計(jì)數(shù)旷痕,在ARC環(huán)境下,屬性@property的內(nèi)存管理語義關(guān)鍵字有copy,weak,strong,asssin顽冶。在編譯階段欺抗,默認(rèn)情況下編譯器會(huì)生成一個(gè)成員變量、一個(gè)setter方法强重、一個(gè)getter方法绞呈。而在setter方法中贸人,會(huì)根據(jù)內(nèi)存管理語義做相應(yīng)的引用計(jì)數(shù)相關(guān)的操作。當(dāng)使用copy修飾屬性時(shí)佃声,在setter中實(shí)際操作是拷貝了一份不可變的類型對象艺智。這樣的話,即使是其是可變類型圾亏,在被賦值后十拣,我們得到的是卻是不可變類型的對象。

  2. OC具有多態(tài)性志鹃,父類可以指向子類夭问。對象最終類型會(huì)在運(yùn)行期根據(jù)實(shí)例化對象確認(rèn)。在運(yùn)行時(shí)階段其isa指向的是[NSArray Class]曹铃。那么當(dāng)向self.photos發(fā)送一個(gè)addObject消息時(shí)缰趋,self.photos對象是接收不到這個(gè)消息的。因?yàn)閍ddObject是NSArray的子類NSMutbleArray的方法陕见。

  3. 屬性語義多種:

  • 原子性(Atomicity):原子性(atomic)埠胖、非原子性(nonatomic)
  • Setter語義(Setter Semantics):strong,weak,copy,asssin
  • 讀寫屬性(Writability): readwrite/readonly
    原子性是具有線程安全的,會(huì)在屬性的setter方法內(nèi)部加個(gè)一個(gè)自旋鎖淳玩、而非原子性是不會(huì)在setter方法中加鎖的,是非線程安全的非竿。在小型設(shè)備的上蜕着,內(nèi)存空間是有限的。給屬性加自旋鎖是非常消耗資源的红柱。并且不一定說使用了原子性就能保證該屬性線程安全承匣。這個(gè)僅僅是在setter方法中是安全的,這也是atomic該做的事锤悄。如果繞開setter方法使用其他的方式給屬性賦值韧骗,依然是不安全的,比如使用KVC零聚。
  1. ARC下袍暴,屬性的默認(rèn)語義是:
  • 基本數(shù)據(jù):atomic、assgin隶症、readwrite
  • 普通的OC對象:atomic政模、strong、readwrite

在此情況下蚂会,實(shí)際編譯器添加setter方法如下:

// ARC
- (void)setPhotos:(NSMutableArray<UIImage *> *)photos{
    // 1. 開始加鎖淋样,非自然語言,這里不寫代碼了
    _photos = [photos copy];
    // 2. 加鎖結(jié)束
}

那么得到的是個(gè)self.photos實(shí)際是NSArray類胁住。

從上就發(fā)現(xiàn)了2個(gè)問題:屬性就是使用了關(guān)鍵字atomic趁猴、copy修飾刊咳。那么這里會(huì)加鎖并且得到NSArray類的self.photos。

相關(guān)概念:

  1. 自旋鎖:當(dāng)上一個(gè)線程的任務(wù)沒有執(zhí)行完畢的時(shí)候(被鎖桌芩尽)娱挨,那么下一個(gè)線程會(huì)一直等待(不會(huì)睡眠),當(dāng)上一個(gè)線程的任務(wù)執(zhí)行完畢枫慷,下一個(gè)線程會(huì)立即執(zhí)行让蕾。
  2. 自旋鎖應(yīng)用場景:
    比較適合做一些不耗時(shí)的操作

解決

1、修改copy語義在setter中默認(rèn)內(nèi)容:

方式一:
手動(dòng)重寫setter方法或听,使用賦值前mutableCopy探孝。如下,這樣獲取到的就是NSMutableArray類型的對象誉裆。

- (void)setPhotos:(NSMutableArray<UIImage *> *)photos{
    _photos = [photos mutableCopy];
}

方式二:
使用關(guān)鍵字strong修飾屬性顿颅。我們得到的依然是可變類型。

- (void)setPhotos:(NSMutableArray<UIImage *> *)photos{
    _photos = photos;
}

2足丢、原子性修改:
使用:nonatomic粱腻,減少小型設(shè)備中性能消耗。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末斩跌,一起剝皮案震驚了整個(gè)濱河市绍些,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌耀鸦,老刑警劉巖柬批,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異袖订,居然都是意外死亡氮帐,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進(jìn)店門洛姑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來上沐,“玉大人,你說我怎么就攤上這事楞艾〔瘟” “怎么了?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵产徊,是天一觀的道長昂勒。 經(jīng)常有香客問我,道長舟铜,這世上最難降的妖魔是什么戈盈? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上塘娶,老公的妹妹穿的比我還像新娘归斤。我一直安慰自己,他們只是感情好刁岸,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布脏里。 她就那樣靜靜地躺著,像睡著了一般虹曙。 火紅的嫁衣襯著肌膚如雪迫横。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天酝碳,我揣著相機(jī)與錄音矾踱,去河邊找鬼。 笑死疏哗,一個(gè)胖子當(dāng)著我的面吹牛呛讲,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播返奉,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼贝搁,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了芽偏?” 一聲冷哼從身側(cè)響起雷逆,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎污尉,沒想到半個(gè)月后关面,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡十厢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了捂齐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蛮放。...
    茶點(diǎn)故事閱讀 39,841評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖奠宜,靈堂內(nèi)的尸體忽然破棺而出包颁,到底是詐尸還是另有隱情,我是刑警寧澤压真,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布娩嚼,位于F島的核電站,受9級特大地震影響滴肿,放射性物質(zhì)發(fā)生泄漏岳悟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望贵少。 院中可真熱鬧呵俏,春花似錦、人聲如沸滔灶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽录平。三九已至麻车,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間斗这,已是汗流浹背动猬。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留涝影,地道東北人枣察。 一個(gè)月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像燃逻,于是被迫代替她去往敵國和親序目。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評論 2 354

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

  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時(shí)...
    歐辰_OSR閱讀 29,383評論 8 265
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,101評論 1 32
  • 設(shè)計(jì)模式是什么伯襟? 你知道哪些設(shè)計(jì)模式猿涨,并簡要敘述? 設(shè)計(jì)模式是一種編碼經(jīng)驗(yàn)姆怪,就是用比較成熟的邏輯去處理某一種類型的...
    iOS菜鳥大大閱讀 708評論 0 1
  • 本文純屬鄙人淺陋之見叛赚,如有不當(dāng)之處還請多多批評指教!文章標(biāo)題或許不能說是文學(xué)稽揭,亦或勉強(qiáng)說是文學(xué)俺附,畢竟本人學(xué)識(shí)尚淺。...
    拚搏一生閱讀 499評論 0 1
  • 總結(jié)一下目前的游戲的商品交易系統(tǒng) 首先是玩家與玩家之間的交易 通過交易系統(tǒng)進(jìn)行交易:例如魔獸的拍賣所溪掀,玩家在系統(tǒng)的...
    xunzou閱讀 1,652評論 0 0