記錄iOS開發(fā)中的一些小技巧(一)

記錄一下日常開發(fā)中用到的一些比較偏的知識(shí)

GCC語法:
self.navigationItem.rightBarButtonItem = ({

     UIBarButtonItem *rightItem = [[UIBarButtonItem alloc] initWithTitle:@"只看樓主" style:UIBarButtonItemStylePlain target:self action:@selector(onlyFollowLord:)];

     [rightItem setTitleTextAttributes:@{NSFontAttributeName:font(14.0)} forState:UIControlStateNormal];

     rightItem.tintColor = [UIColor textDarkGrayColor];

     rightItem;

});
這個(gè)問題嚴(yán)格上講和Objective-C沒什么太大的關(guān)系煤杀,這個(gè)是GNU C的對(duì)C的擴(kuò)展語法 Xcode采用的Clang編譯眷蜈,Clang作為GCC的替代品,和GCC一樣對(duì)于GNU C語法完全支持

你可能知道if(condition)后面只能根一條語句沈自,多條語句必須用{}闊起來酌儒,這個(gè)語法擴(kuò)展即將一條(多條要用到{})語句外面加一個(gè)括號(hào)(), 這樣的話你就可以在表達(dá)式中應(yīng)用循環(huán)、判斷甚至本地變量等枯途。表達(dá)式()最后一行應(yīng)該一個(gè)能夠計(jì)算結(jié)果的子表達(dá)式加上一個(gè)分號(hào)(;), 這個(gè)子表達(dá)式作為整個(gè)結(jié)構(gòu)的返回結(jié)果

這個(gè)擴(kuò)展在代碼中最常見的用處在于宏定義中
用runtime實(shí)現(xiàn)model序列化:

- (instancetype)initWithCoder:(NSCoder *)aDecoder {

     if (self = [super init]) {

          unsigned int count = 0;

          Ivar *ivar = class_copyIvarList([self class], &count);

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

               Ivar iva = ivar[i];

               const char *name = ivar_getName(iva);

               NSString *strName = [NSString stringWithUTF8String:name];

               id value = [aDecoder decodeObjectForKey:strName];

               [self setValue:value forKey:strName];
          }
          free(ivar);
     }
     return self;
}

- (void)encodeWithCoder:(NSCoder *)aCoder {

     unsigned int count;

     Ivar *ivar = class_copyIvarList([self class], &count);

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

          Ivar iv = ivar[i];

          const char *name = ivar_getName(iv);

          NSString *strName = [NSString stringWithUTF8String:name];

          id value = [self valueForKey:strName];

          [aCoder encodeObject:value forKey:strName];

     }

     free(ivar);

}

工程中的category(類目)里的方法不需要導(dǎo)入頭文件就能執(zhí)行忌怎,比如修改父類方法時(shí),不導(dǎo)入頭文件也能實(shí)現(xiàn)酪夷,如果要在category(類目)中加入新的方法或者屬性才需要導(dǎo)入頭文件榴啸。

子線程中要修改外界的值需要用到線程鎖,以防多處子線程同時(shí)修改同一值而造成閃退

問題代碼:

NSMutableArray *array = [NSMutableArray arrayWithObjects:@"haha", nil];

//并行

dispatch_queue_t queue = dispatch_queue_create(DISPATCH_QUEUE_PRIORITY_DEFAULT, DISPATCH_QUEUE_CONCURRENT);

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

     dispatch_async(queue, ^{

               if (array.count > 0) {
     
               [array removeObjectAtIndex:0];

          }

     });

}

修改后的代碼:

NSMutableArray *array = [NSMutableArray arrayWithObjects:@"haha", nil];

//并行

dispatch_queue_t queue = dispatch_queue_create(DISPATCH_QUEUE_PRIORITY_DEFAULT, DISPATCH_QUEUE_CONCURRENT);

dispatch_semaphore_t semaphore = dispatch_semaphore_create(1);

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

     dispatch_async(queue, ^{

     dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

     if (array.count > 0) {

          [array removeObjectAtIndex:0];

     }

     dispatch_semaphore_signal(semaphore);

     });

}
合成圖片
- (UIImage *)imageWithName:(NSString *)name size:(CGSize)size {
    //原圖
    UIImage *image = [UIImage imageNamed:name];
    //背景圖
    UIImage *backImage = [image imageWithTintColor:[UIColor colorWithHexString:@"#f39004"]];
    UIGraphicsBeginImageContextWithOptions(size, NO, image.scale);
    
    [backImage drawInRect:(CGRect){CGPointZero,size}];
    [image drawInRect:(CGRect){(size.width - image.size.width) / 2,(size.height - image.size.height) / 2,image.size.width,image.size.height}];
    //合成
    UIImage *newsImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    return newsImage;
}
用GCD倒計(jì)時(shí)
-(void)startTimerBackZero:(NSInteger)time {
    __block NSInteger timeout = time; //倒計(jì)時(shí)時(shí)間
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_source_t _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0,queue);
    dispatch_source_set_timer(_timer,dispatch_walltime(NULL, 0),1ull*NSEC_PER_SEC, 0); //每秒執(zhí)行
    dispatch_source_set_event_handler(_timer, ^{
        if(timeout<=0){ //倒計(jì)時(shí)結(jié)束晚岭,關(guān)閉
            dispatch_source_cancel(_timer);
            dispatch_async(dispatch_get_main_queue(), ^{
                //設(shè)置界面的按鈕顯示 根據(jù)自己需求設(shè)置
                self.enabled = YES;
                [self setTitle:@"重發(fā)驗(yàn)證碼" forState:UIControlStateNormal]; 
            });
        }else{ 
            self.enabled = NO;
            NSString *strTime = [NSString stringWithFormat:@"%ld秒后重獲",(long)timeout];
            dispatch_async(dispatch_get_main_queue(), ^{
                //設(shè)置界面的按鈕顯示 根據(jù)自己需求設(shè)置
                [self setTitle:strTime forState:UIControlStateNormal];
            });
            timeout--; 
        }
    });
    dispatch_resume(_timer);
}
生成二維碼
// 創(chuàng)建過濾器
    CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
    // 恢復(fù)默認(rèn)
    [filter setDefaults];
    NSData *data = [self.shopURL dataUsingEncoding:NSUTF8StringEncoding];
    [filter setValue:data forKeyPath:@"inputMessage"];
    // 獲取輸出的二維碼
    CIImage *outputImage = [filter outputImage];
    // 將CIImage轉(zhuǎn)換成UIImage鸥印,并放大顯示
    outputImage = [outputImage imageByApplyingTransform:CGAffineTransformMakeScale(150, 150)];
    [UIImage imageWithCIImage:outputImage];
Autolayout的兩個(gè)屬性的使用說明
640254-97c4b2c919ac69d8.png.jpeg

“Content Compression Resistance Priority”,也叫內(nèi)容壓縮阻力優(yōu)先級(jí)(小名:別擠我)坦报,該優(yōu)先級(jí)越高库说,則越晚輪到被壓縮。

“Content Hugging Priority”片择,也叫內(nèi)容緊靠優(yōu)先級(jí)(小名:別扯我)潜的,該優(yōu)先級(jí)越高,這越晚輪到被拉伸构回。

漸變顏色
- (CAGradientLayer *)shadowAsInverse {
    CAGradientLayer *layer = [[CAGradientLayer alloc] init];
    CGRect rect = _imageView.bounds;
    layer.frame = rect;
    layer.colors = [NSArray arrayWithObjects:(id)[UIColor yellowColor].CGColor,(id)[UIColor redColor].CGColor, nil];
    layer.startPoint = CGPointMake(0, 0);
    layer.endPoint = CGPointMake(1, 0);
    layer.cornerRadius = 64;
    return layer;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末夏块,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子纤掸,更是在濱河造成了極大的恐慌脐供,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件借跪,死亡現(xiàn)場離奇詭異政己,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)掏愁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門歇由,熙熙樓的掌柜王于貴愁眉苦臉地迎上來卵牍,“玉大人,你說我怎么就攤上這事沦泌『迹” “怎么了?”我有些...
    開封第一講書人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵谢谦,是天一觀的道長释牺。 經(jīng)常有香客問我,道長回挽,這世上最難降的妖魔是什么没咙? 我笑而不...
    開封第一講書人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮千劈,結(jié)果婚禮上祭刚,老公的妹妹穿的比我還像新娘。我一直安慰自己墙牌,他們只是感情好涡驮,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著憔古,像睡著了一般遮怜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鸿市,一...
    開封第一講書人閱讀 51,578評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音即碗,去河邊找鬼焰情。 笑死,一個(gè)胖子當(dāng)著我的面吹牛剥懒,可吹牛的內(nèi)容都是我干的内舟。 我是一名探鬼主播,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼初橘,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼验游!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起保檐,我...
    開封第一講書人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤耕蝉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后夜只,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體垒在,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年扔亥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了场躯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谈为。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖踢关,靈堂內(nèi)的尸體忽然破棺而出伞鲫,到底是詐尸還是另有隱情,我是刑警寧澤签舞,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布秕脓,位于F島的核電站,受9級(jí)特大地震影響瘪菌,放射性物質(zhì)發(fā)生泄漏撒会。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一师妙、第九天 我趴在偏房一處隱蔽的房頂上張望诵肛。 院中可真熱鬧,春花似錦默穴、人聲如沸怔檩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽薛训。三九已至,卻和暖如春仑氛,著一層夾襖步出監(jiān)牢的瞬間乙埃,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來泰國打工锯岖, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留介袜,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓出吹,卻偏偏與公主長得像遇伞,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子捶牢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

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