雜七雜八的小tips(持續(xù)更新)

一宝穗、關(guān)于NSNull

先說(shuō)說(shuō)nil和NULL代表的是內(nèi)存中的一塊空地址,NSNull表示的是一個(gè)對(duì)象螺捐,指向一個(gè)nil地址颠悬。
文檔上這樣描述,NSNull一個(gè)單例定血,NSNull是一個(gè)用來(lái)表示不允許空值集合對(duì)象中的空值的赔癌。
其實(shí)NSNull存在的意義在于,OC中集合類型只能存儲(chǔ)對(duì)象不能存儲(chǔ)nil澜沟。存儲(chǔ)nil會(huì)報(bào)NSInvalidArgumentException灾票。可以用NSNull替代茫虽。

二铝条、self和super

在方法調(diào)用方面self表示調(diào)用自己的方法,super表示調(diào)用父類方法席噩。
self其實(shí)是類或者對(duì)象班缰,super是預(yù)編譯指令。
super調(diào)用的方法會(huì)轉(zhuǎn)換成如下指令:

//以class方法為例
[super class]
//runtime層
struct objc_super1 {
        __unsafe_unretained id receiver;
        Class superClass;
 };
struct objc_super1 obj_super = {self,class_getSuperclass(object_getClass(self))};
id obj3 = objc_msgSendSuper(&obj_super,@selector(class));

可以看出super調(diào)用方法的時(shí)候會(huì)傳入當(dāng)前對(duì)象

三悼枢、保證屬性讀寫線程安全的方案

  • 方案一:讀寫時(shí)加鎖可以實(shí)現(xiàn)需求埠忘,但這樣所有的屬性讀寫都是原子的,我們的需求是針對(duì)同一屬性線程安全馒索,所以這樣做效率較低莹妒。
  • 方案二:可以創(chuàng)建一個(gè)串行隊(duì)列,把讀寫操作放到這個(gè)串行隊(duì)中同步執(zhí)行绰上,串行隊(duì)列的性質(zhì)可保證線程安全旨怠。優(yōu)化的話,可以將寫操作改為異步執(zhí)行蜈块,讀操作改為同步執(zhí)行鉴腻。這樣做的好處在于寫操作速度加快迷扇,不會(huì)阻塞主線程,但是究其根本所有的讀寫任務(wù)還是同步的爽哎,所以讀寫效率并不高蜓席。代碼如下:
- (void)setSomeString:(NSString *)someString{
    dispatch_async(self.serialQueue, ^{
        _someString = someString;
    });
}
- (NSString *)someString{
    __block NSString * localString;
    dispatch_sync(self.serialQueue, ^{
        localString = _someString;
    })
    return localString;
}
  • 方案三:前面提到,讀取操作我們可以并行去做课锌,因?yàn)槊總€(gè)屬性互不干擾厨内,只要不與讀取操作同事執(zhí)行就可以,柵欄方法dispatch_barrier_async會(huì)在隊(duì)列中必須單獨(dú)執(zhí)行渺贤,一定不會(huì)與其他任務(wù)并發(fā)雏胃,利用這個(gè)特性,我可以更好的實(shí)現(xiàn)需求志鞍。代碼如下:
- (void)setSomeString:(NSString *)someString{
    dispatch_barrier_async(self.syncQueue, ^{
        _someString = someString;
    })
}
- (NSString *)someString{
    __block NSString * localString;
    dispatch_sync(self.syncQueue, ^{
        localString = _someString;
    })
    return localString;
}

以上代碼在不同線程讀取屬性的時(shí)候丑掺,可以并發(fā)讀取。同時(shí)又保證了讀取時(shí)的同步述雾。

  • 擴(kuò)展,我們思考一下為什么不建議屬性用atomic關(guān)鍵字兼丰,大家都知道玻孟,其實(shí)atomic就是通過自旋鎖來(lái)保證讀寫線程安全的,這樣同一對(duì)象所有的屬性讀取都是同步的鳍征,而且會(huì)阻塞主線程黍翎,所以如果必須保證屬性的線程安全的話,推薦方案三艳丛。那么引申出來(lái)匣掸,如何保證兩類操作之間的線程安全呢?方案三是最好的選擇氮双。

四碰酝、GCD與NSOperation

GCD是純C的API,而NSOperation是面向?qū)ο蟮拇鞑睿珿CD是用塊這種輕量級(jí)的數(shù)據(jù)結(jié)構(gòu)來(lái)表示任務(wù)的送爸,而GCD則是用更加重量級(jí)的對(duì)象來(lái)表示的,NSOperation是基于GCD的那NSOperation的好處如下暖释。

  • NSOperation可以通過cancel方法輕易的取消隊(duì)列中的任務(wù)袭厂,而GCD把塊安排到隊(duì)列中后是無(wú)法取消的。
  • GCD可以輕易的設(shè)置依賴關(guān)系球匕,比如一個(gè)網(wǎng)絡(luò)操作需要之前的5個(gè)任務(wù)處理完畢之后才能進(jìn)行纹磺,我們可以將請(qǐng)求任務(wù)依賴于那五個(gè)任務(wù),這樣簡(jiǎn)單的可以實(shí)現(xiàn)需求亮曹,用GCD我們要用dispatch_group或者信號(hào)量的同步方式橄杨。
  • 通過鍵值觀察可以了解到NSOperation的聲明周期秘症,比如屬性isCancel、isFinished等等讥珍。NSOperation適合進(jìn)行比GCD更加精密的操作历极。
  • NSOperation可以執(zhí)行操作的優(yōu)先級(jí),隊(duì)列中優(yōu)先級(jí)高的任務(wù)先執(zhí)行衷佃,GCD則沒有直接操作優(yōu)先級(jí)的功能趟卸,只能操作隊(duì)列的優(yōu)先級(jí)。
  • NSOperation對(duì)象內(nèi)置了很多方便的子類氏义,比如NSBlockOperation锄列。

五、用NSCache的幾點(diǎn)好處

  • 低內(nèi)存時(shí)自動(dòng)刪減緩存惯悠,LRU(最近最少使用)緩存淘汰邻邮。
  • 不同于NSDictionary,NSCache并不會(huì)拷貝鍵克婶,而是會(huì)保留鍵筒严,一些不支持拷貝的類也可以作為鍵。
  • 可以設(shè)置最大開銷情萤,和數(shù)量鸭蛙,但這并不是對(duì)cache的硬限制,只做參考筋岛。
  • NSCache可以配合NSPurgeableData使用娶视,當(dāng)NSPurgeableData對(duì)象被系統(tǒng)釋放的時(shí)候,緩存自動(dòng)清除睁宰。

六肪获、bounds和frame的區(qū)別?

  • bounds:相對(duì)自身來(lái)說(shuō)的柒傻,控件的內(nèi)部尺寸孝赫,如果修改了Bounds,子控件的相對(duì)位置也會(huì)發(fā)生改變红符。
  • Frame:相對(duì)于父控件來(lái)說(shuō)的寒锚,是控件的外部尺寸。
    舉個(gè)例子:
        let view = UIView(frame: CGRect.init(x: 100, y: 100, width: 100, height: 100));
        view.backgroundColor = UIColor.red;
        self.view.addSubview(view);
        
        let subView = UIView(frame: CGRect.init(x: 20, y: 20, width: 60, height: 60));
        subView.backgroundColor = UIColor.blue;
        view.addSubview(subView);
        
        print("viewFrame:\(view.frame) viewBounds:\(view.bounds)  subViewFrame:\(subView.frame)");
        
        view.transform = CGAffineTransform.init(scaleX: 2, y: 2);
        
        print("viewFrame:\(view.frame) viewBounds:\(view.bounds)  subViewFrame:\(subView.frame)");

//打印結(jié)果:
viewFrame:(100.0, 100.0, 100.0, 100.0) viewBounds:(0.0, 0.0, 100.0, 100.0)  subViewFrame:(20.0, 20.0, 60.0, 60.0)
viewFrame:(50.0, 50.0, 200.0, 200.0) viewBounds:(0.0, 0.0, 100.0, 100.0)  subViewFrame:(20.0, 20.0, 60.0, 60.0)

如上代碼給一個(gè)視圖放大而被违孝,發(fā)現(xiàn)其frame改變了刹前,因?yàn)殄^點(diǎn)默認(rèn)是中心,所以按中心放大雌桑,但是其bounds沒有改變喇喉,subView的frame也沒有改變。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末校坑,一起剝皮案震驚了整個(gè)濱河市拣技,隨后出現(xiàn)的幾起案子千诬,更是在濱河造成了極大的恐慌,老刑警劉巖膏斤,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件徐绑,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡莫辨,警方通過查閱死者的電腦和手機(jī)傲茄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)沮榜,“玉大人盘榨,你說(shuō)我怎么就攤上這事◇∪冢” “怎么了草巡?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)型酥。 經(jīng)常有香客問我山憨,道長(zhǎng),這世上最難降的妖魔是什么弥喉? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任郁竟,我火速辦了婚禮,結(jié)果婚禮上档桃,老公的妹妹穿的比我還像新娘。我一直安慰自己憔晒,他們只是感情好藻肄,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著拒担,像睡著了一般嘹屯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上从撼,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天州弟,我揣著相機(jī)與錄音,去河邊找鬼低零。 笑死婆翔,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的掏婶。 我是一名探鬼主播啃奴,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼雄妥!你這毒婦竟也來(lái)了最蕾?” 一聲冷哼從身側(cè)響起依溯,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瘟则,沒想到半個(gè)月后黎炉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡醋拧,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年慷嗜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片趁仙。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡洪添,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出雀费,到底是詐尸還是另有隱情干奢,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布盏袄,位于F島的核電站忿峻,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏辕羽。R本人自食惡果不足惜逛尚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望刁愿。 院中可真熱鬧绰寞,春花似錦、人聲如沸铣口。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)脑题。三九已至件缸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間叔遂,已是汗流浹背他炊。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留已艰,地道東北人痊末。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像哩掺,于是被迫代替她去往敵國(guó)和親舌胶。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

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

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,103評(píng)論 1 32
  • 1.設(shè)計(jì)模式是什么辆它? 你知道哪些設(shè)計(jì)模式,并簡(jiǎn)要敘述履恩?設(shè)計(jì)模式是一種編碼經(jīng)驗(yàn)锰茉,就是用比較成熟的邏輯去處理某一種類型...
    龍飝閱讀 2,153評(píng)論 0 12
  • 最全的iOS面試題及答案 iOS面試小貼士 ———————————————回答好下面的足夠了-----------...
    zweic閱讀 2,702評(píng)論 0 73
  • 【結(jié)論論點(diǎn)】 作者認(rèn)為反思可以促進(jìn)已有知識(shí)產(chǎn)生新知識(shí) 【思考】 那我們?nèi)绾稳プ龅竭@一點(diǎn)呢? 作者又是如何看待“反思...
    快樂的阿紫閱讀 235評(píng)論 0 3
  • 作者原創(chuàng)切心,轉(zhuǎn)載請(qǐng)聯(lián)系作者經(jīng)過建立Netconnection和CreateStream之后飒筑,客戶端就可以進(jìn)行相應(yīng)的流...
    Alfie20閱讀 3,345評(píng)論 0 1