iOS-Tips

1:釋放單例的方法

static dispatch_once_t onceToken;
onceToke = 0;

2:NSNotificationCenter 在哪個線程post則在哪個線程轉(zhuǎn)發(fā)丈秩,不是add時候的線程

主線程執(zhí)行

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(noti) name:@"abc" object:nil];

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    //打印[NSThread currentThread]
        [[NSNotificationCenter defaultCenter] postNotificationName:@"abc" object:@"a"];
 
    });
- (void)noti{
    //打印[NSThread currentThread]

    NSLog(@"noti");
}

結(jié)果:

<NSThread: 0x60000026bd00>{number = 3, name = (null)}
<NSThread: 0x60000026bd00>{number = 3, name = (null)}

如果noti方法是要更新UI赁严,請確保post在主線程上或者在noti方法內(nèi)處理一下岂嗓。

3:注冊通訊錄變化通知

ABAddressBookRegisterExternalChangeCallback(addressBook, addressBookChanged2, nil);

只能注冊一次玖瘸,否則當(dāng)通訊錄改變時职烧,注冊多少次就會調(diào)用多少次addressBookChanged2

4:NSTimer
invalidate方法調(diào)用必須在timer添加到的runloop所在的線程
http://www.cnblogs.com/mddblog/p/6517377.html

5:等待兩個請求完成之后再更新UI
方法一:http://www.reibang.com/p/943dcb9ad632
方法二:http://www.reibang.com/p/228403206664

dispatch_group_enter(dispatchGroup);
dispatch_group_leave(dispatchGroup);
    dispatch_queue_t queue = dispatch_queue_create("getHomePageQueue", DISPATCH_QUEUE_SERIAL);
    dispatch_async(queue, ^{
       
        dispatch_group_t group = dispatch_group_create();
        dispatch_group_enter(group);
        [self.dataRequestUC requestHomePageDataWithParama:@{} finishBlock:^(id requestResult,NSInteger statusCode) {
            if (requestResult) {
                __strong typeof(weakSelf) strongSelf = weakSelf;
                NSMutableArray *home = [NSMutableArray arrayWithArray:[strongSelf corprationCMSData:requestResult]];
                strongSelf.homePageData = [home mutableCopy];
                dispatch_group_leave(group);
            }
        }];
        dispatch_group_enter(group);
        [self.dataRequestUC requestGJMessageWithParama:@{@"pageSize":@"3",@"pageNo":@"1"} finishBlock:^(id requestResult, NSInteger statusCode) {
            __strong typeof(weakSelf) strongSelf = weakSelf;
            
            if ([requestResult isKindOfClass:[NSDictionary class]]) {
                NSDictionary *body = requestResult[@"body"];
                NSArray *data = body[@"data"];
                [strongSelf corperationMessage:data];
                dispatch_group_leave(group);
            }

            
        }];
        long timeout = dispatch_group_wait(group, dispatch_time(DISPATCH_TIME_NOW, (int64_t)10*NSEC_PER_SEC));
        if (timeout) {
            dataBlock(nil);
        }
        dispatch_group_notify(group, dispatch_get_main_queue(), ^{
            dataBlock([self combineData]);
            
        });

dispatch_group_wait不能在主線程使用貌踏,否則會阻塞十气。
方法三:RAC
方法四:dispatch_barrier_async
方法五:NSOperationQueue addDependency

6:自定義NSOperation
重寫start方法支持異步操作,但是需要管理狀態(tài)瑟枫,并且以KVO的方式進(jìn)行實現(xiàn)
重寫main方法不用管理operation的狀態(tài)斗搞,為了能夠使用操作隊列的取消功能,需要不斷的檢查isCancel

- (void)main
{
    while (notDone && !self.isCancelled) {
        // 進(jìn)行處理
    }
}

7:在 Objective-C 中將屬性以 atomic 的形式來聲明慷妙,就能支持互斥鎖了僻焚。默認(rèn)就為atomic,但是開銷較大景殷。
加鎖解鎖有性能消耗溅呢,當(dāng)獲取鎖的時候澡屡,如果屬性已經(jīng)某一個線程操作猿挚,則當(dāng)前線程需要等待,等屬性被操作完畢驶鹉,解鎖后才能繼續(xù)進(jìn)行绩蜻。

8:如果你在 table view 或者是 collection view 的 cell 上做了自定義繪制的話,最好將它們放入 operation 的子類中去室埋。你可以將它們添加到后臺操作隊列办绝,也可以在用戶將 cell 滾動出邊界時的 didEndDisplayingCell 委托方法中進(jìn)行取消

9:在后臺或者子線程訪問UIKit/APPKit等屬性,如設(shè)置image則設(shè)置生效的時間會延后姚淆。如果有兩個及以上的線程同時進(jìn)行訪問或設(shè)置孕蝉,會造成時機性的崩潰問題。

10:iOS中用來表示內(nèi)存的堆棧與數(shù)據(jù)結(jié)構(gòu)中的堆棧代表的意義不一樣
棧:先進(jìn)后出
全局和靜態(tài)變量在堆中
指針放在棧中腌逢,APP通過在棧中找到數(shù)據(jù)的指針降淮,指向堆中的數(shù)據(jù)。

11:創(chuàng)建靜態(tài)庫搏讶,使用cocoapod管理第三方依賴佳鳖。pod install以后會自動在link Binary With Libraries中將工程名的靜態(tài)庫放進(jìn)去,導(dǎo)致編譯報錯

error: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/libtool: can't locate file for: -lPods-projectName

error: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/libtool: file: -lPods-projectName is not an object file (not allowed in a library)

手動刪除后媒惕,編譯成功系吩。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市妒蔚,隨后出現(xiàn)的幾起案子穿挨,更是在濱河造成了極大的恐慌月弛,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件科盛,死亡現(xiàn)場離奇詭異尊搬,居然都是意外死亡,警方通過查閱死者的電腦和手機土涝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進(jìn)店門佛寿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人但壮,你說我怎么就攤上這事冀泻。” “怎么了蜡饵?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵弹渔,是天一觀的道長。 經(jīng)常有香客問我溯祸,道長肢专,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任焦辅,我火速辦了婚禮博杖,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘筷登。我一直安慰自己剃根,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布前方。 她就那樣靜靜地躺著狈醉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪惠险。 梳的紋絲不亂的頭發(fā)上苗傅,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天,我揣著相機與錄音班巩,去河邊找鬼渣慕。 笑死,一個胖子當(dāng)著我的面吹牛趣竣,可吹牛的內(nèi)容都是我干的摇庙。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼遥缕,長吁一口氣:“原來是場噩夢啊……” “哼卫袒!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起单匣,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤夕凝,失蹤者是張志新(化名)和其女友劉穎宝穗,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體码秉,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡逮矛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了转砖。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片须鼎。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖府蔗,靈堂內(nèi)的尸體忽然破棺而出晋控,到底是詐尸還是另有隱情,我是刑警寧澤姓赤,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布赡译,位于F島的核電站,受9級特大地震影響不铆,放射性物質(zhì)發(fā)生泄漏蝌焚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一誓斥、第九天 我趴在偏房一處隱蔽的房頂上張望只洒。 院中可真熱鬧,春花似錦岖食、人聲如沸红碑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至羡鸥,卻和暖如春蔑穴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背惧浴。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工存和, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人衷旅。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓捐腿,卻偏偏與公主長得像,于是被迫代替她去往敵國和親柿顶。 傳聞我的和親對象是個殘疾皇子茄袖,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,490評論 2 348