總結(jié)

#### 講一下atomic的實(shí)現(xiàn)機(jī)制盈简;為什么不能保證絕對的線程安全(最好可以結(jié)合場景來說)?


? runtime里的源碼:

? getter方法

? ```

? id objc_getProperty(id self, SEL _cmd, ptrdiff_t offset, BOOL atomic) {

? ? if (offset == 0) {

? ? ? ? return object_getClass(self);

? ? }

? ? // Retain release world

? ? id *slot = (id*) ((char*)self + offset);

? ? if (!atomic) return *slot;


? ? // Atomic retain release world

? ? spinlock_t& slotlock = PropertyLocks[slot];

? ? slotlock.lock();

? ? id value = objc_retain(*slot);

? ? slotlock.unlock();


? ? // for performance, we (safely) issue the autorelease OUTSIDE of the spinlock.

? ? return objc_autoreleaseReturnValue(value);

}

? ```

? setter方法:

? ```

? static inline void reallySetProperty(id self, SEL _cmd, id newValue, ptrdiff_t offset, bool atomic, bool copy, bool mutableCopy)

{

? ? if (offset == 0) {

? ? ? ? object_setClass(self, newValue);

? ? ? ? return;

? ? }

? ? id oldValue;

? ? id *slot = (id*) ((char*)self + offset);

? ? if (copy) {

? ? ? ? newValue = [newValue copyWithZone:nil];

? ? } else if (mutableCopy) {

? ? ? ? newValue = [newValue mutableCopyWithZone:nil];

? ? } else {

? ? ? ? if (*slot == newValue) return;

? ? ? ? newValue = objc_retain(newValue);

? ? }


? ? if (!atomic) {

? ? ? ? oldValue = *slot;

? ? ? ? *slot = newValue;

? ? } else {

? ? ? ? spinlock_t& slotlock = PropertyLocks[slot];

? ? ? ? slotlock.lock();

? ? ? ? oldValue = *slot;

? ? ? ? *slot = newValue;? ? ? ?

? ? ? ? slotlock.unlock();

? ? }

? ? objc_release(oldValue);

}

? ```

? 從上面可以看出彪腔,使用atomic之后,在setter和getter方法里會使用自旋鎖spinlock_t來保證setter方法和getter方法的線程的安全进栽,可以看做getter方法獲取到返回值之前不會執(zhí)行setter方法里的賦值代碼德挣。但是出了getter方法和setter方法后就不能保證線程安全了,舉個(gè)例子:

? ```

@property (atomic, assign)? ? int? ? ? intA;//初始值是0

//thread A

? ? self.intA = self.intA + 2 ;


//thread B

? ? self.intA = self.intA + 3;

? ```

? 上面的例子快毛,雖然settr和getter方法是線程安全的格嗅,但是 self.intA = self.intA + 2 ;這個(gè)語句不是線程安全的,因?yàn)樗梢苑譃槿齻€(gè)指令:

? - 從內(nèi)存中取出intA的值放到寄存器中唠帝;

? - 把寄存器中值加上某一個(gè)數(shù)屯掖;

? - 再把寄存器中得值放回內(nèi)存中;

來觀察一下AB兩個(gè)線程交錯(cuò)執(zhí)行會發(fā)生什么:

1. A線程:讀取intA的放到一個(gè)寄存器A(0);

2. B線程:讀取intA的放到一個(gè)寄存器B(0);

3. A線程:將寄存器A的值加2(2);

4. B線程:將寄存器B的值加3(3);

5. A線程:將寄存器A的值加協(xié)會到內(nèi)存襟衰,此時(shí)intA的值是2;

6. B線程:將寄存器B的寫回到內(nèi)存贴铜,此時(shí)intA的值是3;

我們預(yù)期的結(jié)果是5,但實(shí)際返回的結(jié)果可能是最后寫入內(nèi)存的那個(gè)值瀑晒。

再舉個(gè)栗子:

```

@property (atomic, strong) NSArray*? ? ? ? ? ? ? ? arr;

//thread A

for (int i = 0; i < 100000; i ++) {

? ? if (i % 2 == 0) {

? ? ? ? self.arr = @[@"1", @"2", @"3"];

? ? }

? ? else {

? ? ? ? self.arr = @[@"1"];

? ? }

? ? NSLog(@"Thread A: %@\n", self.arr);

}

//thread B

for (int i = 0; i < 100000; i ++) {

? ? if (self.arr.count >= 2) {

? ? ? ? NSString* str = [self.arr objectAtIndex:1];

? ? }

? ? NSLog(@"Thread B: %@\n", self.arr);

}

```

上面的例子線程B里面可能會因?yàn)閿?shù)組越界而引起crash绍坝,因?yàn)榧尤朐贐線程里判斷self.arr.count >= 2的時(shí)候數(shù)組是self.arr = @[@"1", @"2", @"3"];但是當(dāng)調(diào)用[self.arr objectAtIndex:1]可能self.arr的值已經(jīng)在線程A里被更改為了@[@"1"],此時(shí)數(shù)組越界了苔悦。因此轩褐,雖然self.arr是atomic的,還是會出現(xiàn)線程安全問題玖详。



1.什么情況下使用weak關(guān)鍵詞把介,weak和assign有什么不同?

在ARC里竹宋,為了避免出現(xiàn)循環(huán)引用時(shí)劳澄,要使用weak關(guān)鍵詞,比如delegate和block蜈七;

在xib中的IBOutlet屬性秒拔,由于已經(jīng)有了強(qiáng)引用,不需要再用stong關(guān)鍵詞飒硅;

weak修飾的屬性砂缩,在釋放時(shí)會置成nil,assign只是簡單地進(jìn)行賦值操作三娩;

weak只能用于OC對象庵芭,assign可用于非OC對象;

2.為什么NSString雀监、NSArray和NSDictionary使用copy修飾而不用strong双吆;

NSString眨唬、NSArray和NSDictionary有對應(yīng)的可變類型NSMutableString、NSMUtableArray和NSMutableDictionary好乐;當(dāng)我們給設(shè)置方法賦新知識匾竿,比如NSArray類型的對象A,如果傳遞的是其子類NSMutableArray類型的B蔚万,使用strong修飾的A話只是對B進(jìn)行了強(qiáng)引用岭妖,它們指向的是同一個(gè)對象,當(dāng)B發(fā)生變化時(shí)反璃,A其實(shí)也發(fā)生了變化昵慌;使用copy則會copy一份新的對象,B的改變不會影響到A淮蜈。

3.block為什么要用copy修飾斋攀?

在MRC里,block里面的對象是在棧區(qū)的礁芦,使用copy修飾不把他們copy到堆區(qū)仔拟;在ARC里咳胃,編譯器會自動進(jìn)行copy工作隐圾。

4.下面的代碼會有什么問題掂林?

// .h文件

@property (nonatomic, copy) NSMutableArray * mutableArray;

// .m文件

NSMutableArray*array = [NSMutableArray arrayWithObjects:@1,@2,nil];

self.mutableArray = array;

[self.mutableArray removeObjectAtIndex:0];

因?yàn)殛P(guān)鍵詞是copy絮缅,所以復(fù)制后self.mutableArray是不可變對象堡妒,在調(diào)用NSMutableArray的方法時(shí)會造成崩潰晶框。

5.如何使自定義的類支持copy

自定義的類需要遵守NSCopying協(xié)議蜕径,如果類分為可變版本和不可變版本析桥,需要遵守NSMutableCopying協(xié)議司草;

6.@property的本質(zhì)是什么?

@property = ivar(實(shí)例變量) + setter + getter

可以把屬性當(dāng)做一種關(guān)鍵字泡仗,編譯器會自動生成存取方法埋虹,并且向類中自動添加適當(dāng)?shù)膶?shí)例變量,并且在屬性名前添加下劃線娩怎。


7. @protocol 和 category 中如何使用 @property

在 protocol 中使用 property 只會生成 setter 和 getter 方法聲明,我們使用屬性的目的,是希望遵守我協(xié)議的對象能實(shí)現(xiàn)該屬性

category 使用 @property 也是只會生成 setter 和 getter 方法的聲明,如果我們真的需要給 category 增加屬性的實(shí)現(xiàn),需要借助于運(yùn)行時(shí)的兩個(gè)函數(shù):

objc_setAssociatedObject

objc_getAssociatedObject

8.@property中有那些關(guān)鍵字

原子性--nonatomic搔课,atomic;

讀寫權(quán)限--readonly(只讀)readwrite(讀寫)

內(nèi)存管理--assign截亦,weak爬泥,strong,copy unsafe_unretained

方法名--setter崩瓤,getter

9. ARC下袍啡,不顯式指定任何屬性關(guān)鍵字時(shí),默認(rèn)的關(guān)鍵字都有哪些却桶?

對應(yīng)基本數(shù)據(jù)類型默認(rèn)關(guān)鍵字是

atomic,readwrite,assign

對于普通的 Objective-C 對象

atomic,readwrite,strong

10.ASI和AFN的對比

http://www.infoq.com/cn/articles/afn_vs_asi

ASI是基于CFNetwork的境输, 而AFN是基于NSURL的,從性能上來說ASI要好一些。

AFN的推薦用是用一個(gè)公用的HTTPClient嗅剖,使用公用的URL辩越,把網(wǎng)絡(luò)請求就的參數(shù)傳遞到HTTPClient的靜態(tài)方法里,最后通過block回調(diào)把網(wǎng)絡(luò)請求的數(shù)據(jù)回調(diào)出來窗悯。

ASI的用法更傳統(tǒng)区匣,使用時(shí)要初始化一個(gè)ASIHTTPRequest實(shí)例,通過這個(gè)實(shí)例來配置網(wǎng)絡(luò)請求的參數(shù)蒋院,用代理或block進(jìn)行數(shù)據(jù)回調(diào)亏钩。

ASI的直接操作對象ASIHTTPRequest是NSOPeration的子類,在異步請求處理的時(shí)候欺旧,在調(diào)用startAsynchronous方法后會把對象放入到共享的操作隊(duì)列姑丑,所有的操作都是在這個(gè)對象所處的子線程中完成的。

11.網(wǎng)絡(luò)優(yōu)化:

1)減小數(shù)據(jù)請求大小辞友,對于post請求栅哀,Body可以做gzip壓縮;使用專門的算法對于音視頻称龙,圖片進(jìn)行壓縮留拾;

2)精簡數(shù)據(jù)格式,使用json替代xml鲫尊;

3)根據(jù)不同的設(shè)備返回不同分辨率的圖片痴柔;

4)緩存數(shù)據(jù),在一定有效的時(shí)間內(nèi)再次請求時(shí)直接取緩存疫向;

5)對較大的文件咳蔚,可以考慮多連接;


#####HTTP冪等性

HTTP方法的冪等性是指一次和多次請求某一個(gè)資源應(yīng)該具有同樣的副作用

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末搔驼,一起剝皮案震驚了整個(gè)濱河市谈火,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌舌涨,老刑警劉巖糯耍,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異泼菌,居然都是意外死亡谍肤,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進(jìn)店門哗伯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來荒揣,“玉大人,你說我怎么就攤上這事焊刹∠等危” “怎么了恳蹲?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長俩滥。 經(jīng)常有香客問我嘉蕾,道長,這世上最難降的妖魔是什么霜旧? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任错忱,我火速辦了婚禮,結(jié)果婚禮上挂据,老公的妹妹穿的比我還像新娘以清。我一直安慰自己,他們只是感情好崎逃,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布掷倔。 她就那樣靜靜地躺著,像睡著了一般个绍。 火紅的嫁衣襯著肌膚如雪勒葱。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天巴柿,我揣著相機(jī)與錄音凛虽,去河邊找鬼。 笑死广恢,一個(gè)胖子當(dāng)著我的面吹牛涩维,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播袁波,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蜗侈!你這毒婦竟也來了篷牌?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤踏幻,失蹤者是張志新(化名)和其女友劉穎枷颊,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體该面,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡夭苗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了隔缀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片题造。...
    茶點(diǎn)故事閱讀 39,981評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖猾瘸,靈堂內(nèi)的尸體忽然破棺而出界赔,到底是詐尸還是另有隱情丢习,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布淮悼,位于F島的核電站咐低,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏袜腥。R本人自食惡果不足惜见擦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望羹令。 院中可真熱鬧鲤屡,春花似錦、人聲如沸特恬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽癌刽。三九已至役首,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間显拜,已是汗流浹背衡奥。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留远荠,地道東北人矮固。 一個(gè)月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像譬淳,于是被迫代替她去往敵國和親档址。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評論 2 355

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

  • 一邻梆、深復(fù)制和淺復(fù)制的區(qū)別守伸? 1、淺復(fù)制:只是復(fù)制了指向?qū)ο蟮闹羔樒滞磧蓚€(gè)指針指向同一塊內(nèi)存單元尼摹!而不復(fù)制指向?qū)ο蟮?..
    iOS_Alex閱讀 1,376評論 1 27
  • 一.OC的三大特性 封裝、繼承剂娄、多態(tài) 1> 什么是多態(tài) 多態(tài):不同對象以自己的方式響應(yīng)相同的消息的能力叫做多態(tài)蠢涝。 ...
    藍(lán)心兒的藍(lán)色之旅閱讀 1,385評論 0 2
  • 1、在UIScorllView上添加UISlide阅懦,拖動slide的時(shí)候和二,scrollerview會跟著動,解決方...
    渡邊君WM閱讀 3,422評論 5 21
  • 把網(wǎng)上的一些結(jié)合自己面試時(shí)遇到的面試題總結(jié)了一下故黑,以后有新的還會再加進(jìn)來儿咱。 1. OC 的理解與特性 OC 作為一...
    AlaricMurray閱讀 2,564評論 0 20
  • 1.即使你不是天才庭砍,做好準(zhǔn)備工作也會讓你看起來像個(gè)天才! 不論做任何事情混埠,提前做好準(zhǔn)備工作就不至于讓你感覺到慌亂怠缸。...
    梓毓爸閱讀 226評論 0 0