程序員在開發(fā)的過程當(dāng)中防症,會(huì)遇到各種各樣的問題懈费。那么你又是如何解決問題的呢?在這里分享給大家一些解決問題的渠道著榴,希望能夠有所幫助添履。
1.既然有問題我們該怎樣解決呢。
首先我們大部分人都會(huì)去使用百度搜索來解決問題脑又,誰都不例外暮胧,可是百度里面會(huì)產(chǎn)生其他的解決方法锐借,會(huì)使很多人產(chǎn)生誤解。這樣的解決效率不是很高往衷。如果是結(jié)束問題可以去:
- Google 簡單來說比百度搜索的答案相對而言要多钞翔,要更加的準(zhǔn)確,效率更高席舍。如果你英語很好的話嗅战,建議使用英文搜索。
- Stack Overflow 一個(gè)與程序相關(guān)的IT技術(shù)問答網(wǎng)站俺亮,簡單來說工作中的70%問題在這里都能夠得到解決。
搜索是解決問題的一種方法疟呐,那么剩余的30%的問題還是需要自己獨(dú)立的去解決脚曾,那么就會(huì)有人去詢問有沒有能夠提高獨(dú)立解決問題的辦法呢?(比如:積累所遇到的崩潰信息启具,學(xué)會(huì)查看崩潰信息本讥,查看官方文檔的技巧等等)。
2.使用斷點(diǎn)調(diào)試崩潰問題的小技巧
(1)如果當(dāng)前斷點(diǎn)只想內(nèi)存鲁冯,那么就是初始化時(shí)分配內(nèi)存時(shí)有問題
(2)添加全局?jǐn)帱c(diǎn)的問題
使用全局?jǐn)帱c(diǎn)的目的就是當(dāng)產(chǎn)生異晨椒校或者崩潰能夠停留在異常或崩潰發(fā)生的地方薯演,而不是跳轉(zhuǎn)到主函數(shù)
如果說在添加了全局?jǐn)帱c(diǎn)后依然會(huì)跳轉(zhuǎn)到主函數(shù)撞芍,會(huì)遇到如上圖的情況,那么80%問題就是在使用可視化(storyboard或者xib)拖線沒有及時(shí)清理掉壞線如下圖所示
這條Button的連線在代碼中已經(jīng)刪除不用了跨扮,但是沒有及時(shí)清理掉序无,所以造成了崩潰!
3.NSString使用stringWithFormat拼接的相關(guān)知識
- 保留2位小數(shù)點(diǎn)
//.2代表小數(shù)后面保留2位(2代表保留的數(shù)量)
NSString *string = [NSString stringWithFormat:@"%.2f",M_PI];
//輸出結(jié)果是:3.14
NSLog(@"%@",string);
- 用0補(bǔ)全的方法
NSInteger count = 5;
//用02代表:如果count不足2位 用0在最前面補(bǔ)全(2代表總輸出的個(gè)數(shù))
NSString *string = [NSString stringWithFormat:@"%02zd",count];
//輸出的結(jié)果是05衡创;
NSLog(@"%@",string);
- 字符串中有特殊符號%怎么辦
NSInteger count = 50;
//%是一個(gè)特殊符號帝嗡,如果在NSString中用到%需要如下寫法
NSString *string = [NSString stringWithFormat:@"%zd%%",count];
//輸出的結(jié)果50%;
NSLog(@"%@",string);
4.判斷是否為gif\png圖片的正確姿勢
首先我們先想想璃氢,自己會(huì)怎樣去判斷一個(gè)從網(wǎng)絡(luò)獲取的圖片URL是否為GIF圖片哟玷,是否是這樣呢?
//假設(shè)這是一個(gè)網(wǎng)絡(luò)獲取的URL
NSString *path = @"http://pic3.nipic.com/20090709/2893198_075124038_2.gif"
//判斷是否為gif
NSString *extensionName = path.pathExtension;
if([extensionName.lowercaseString isEqualToString:@"gif"]) {
//是gif圖片
} else {
//不是gif圖片
}
以上片段看似是可以的一也,但是這不夠嚴(yán)謹(jǐn)巢寡,在不知道圖片擴(kuò)展名的情況下,如何知道圖片的真實(shí)類型塘秦?其實(shí)就是取出圖片數(shù)據(jù)的第一個(gè)字節(jié)讼渊,就可以判斷出圖片的真實(shí)類型。但是該怎樣操作呢
//通過圖片Data數(shù)據(jù)第一個(gè)字節(jié)來獲取圖片擴(kuò)展名
- (NSString *)contentTypeForImageData:(NSData *)data{
uint8_t c;
[data getBytes:&c length:1];
switch(c){
case 0xFF;
return @"jpeg";
case 0x89;
return @"gif";
case 0x49:
case 0x4D:
return @"tiff";
case 0x52:
if ([data length] < 12) {
return nil;
}
NSString *testString = [[NSString alloc] initWithData:[data subdataWithRange:NSMakeRange(0,12)] encoding:NSASIIStringEncoding];
if ([testString hasPrefix:@"RIFF"] && [testString hasSuffix:@"WEBP"]){
return @"webp";
}
return nil;
}
return nil;
}
其實(shí)圖片數(shù)據(jù)的第一個(gè)字節(jié)是固定的尊剔,一種類型的圖片第一個(gè)字節(jié)就是它的標(biāo)示爪幻,我們來調(diào)用一下這個(gè)方法菱皆。
//假設(shè)這是一個(gè)網(wǎng)絡(luò)獲取的URL
NSString *path = @"http://pic.rpgsky.net/images/2016/07/26/3508cde5f0d29243c7d2ecbd6b9a30f1.png";
NSData *data = [NSData dataWithcontentTypeForImageData:data];
//調(diào)用獲取圖片的擴(kuò)展名
NSString *string = [self contentTypeForImageData:data];
//輸出的結(jié)果為
NSLog(@"%@",string);
5.Button禁止觸摸事件的2中方式
有很多需求在規(guī)定內(nèi)不允許點(diǎn)擊 Button,并且讓用戶知道這個(gè)按鈕是不可以點(diǎn)擊的挨稿。那我們應(yīng)該這樣設(shè)置:
//會(huì)改變按鈕的改變仇轻,顏色會(huì)變灰
button.enabled = NO;
但是又有一個(gè)需求是既不能點(diǎn)擊也不啊喲改變Button顏色
button.userInteractionEnabled = NO;
6.跟xib一起走過的坑
(1)如果在xib中有一個(gè)控件,已經(jīng)明確設(shè)置尺寸了奶甘,輸出的frame也是對的篷店,但是顯示出來的效果不一樣(比如尺寸變大了),如果是這種情況一般就是autoresizingMask自動(dòng)伸縮屬性在搞鬼臭家!解決辦法如下疲陕;
//xib的awakeFromNib方法中設(shè)置UIViewAutoresizingNone進(jìn)行清空
- (void)awakeFromNib{
self.autoresizingMask = UIViewAutoresizingNone;
}
(2)如果你的控制器的view使用xib創(chuàng)建的,當(dāng)你拿到view的尺寸是不準(zhǔn)確的钉赁,在這里我們就需要通過[UIScreen mainScreen].bounds拿到尺寸蹄殃,但是storyboard的尺寸是準(zhǔn)確的!
7你踩。你是用什么方法設(shè)置圖片圓角诅岩?
//cornerRadius 設(shè)置為self.iconImage圖片寬度的一半(圓形圖片)
self.iconImage.layer.cornerRadius = 20;
self.iconImage.layer.maskToBounds = YES;
或者是在xib&storyboard中點(diǎn)擊要設(shè)置圓角的圖片:
在此之后建議大家盡量不要這么設(shè)置,因?yàn)槭褂脠D層過量會(huì)有卡頓現(xiàn)象發(fā)生带膜。特別是弄圓角或者陰影會(huì)很卡頓吩谦。如果設(shè)置圖片圓角我們一般會(huì)用繪圖來做。
//設(shè)置圓形圖片(放到分類中使用)
- (UIImage *)cutCricleImage {
UIGraphicsBeginImageContextWithOptions(self.size,NO,0.0);
//獲取上下文
CGContextRef ctr = CGRectMake(0,0,self.size.width,self,s.size.height);
CGContextAddEllipseInRect(ctr,rect);
//裁剪
CGContextClip(ctr);
//將圖片畫上去
[self drawInRect:rect];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
這個(gè)方法就是設(shè)置圓角圖片膝藕,小老板很高中剩。不會(huì)造成卡頓現(xiàn)象目木。大家要把這個(gè)方法單獨(dú)放到分類中使用嚣潜。
8.##與@#在宏里面怎樣使用
的使用巷懈,首先我們添加一個(gè)宏。
#define LRWeakSelf(type) __weak typeof(type) weak##type = type;
##
是連接作用览绿,即當(dāng)使用上面的宏會(huì)把weak與輸出的type值連接起來如下圖所示策严。
#
的意思是緊跟著它的后面的標(biāo)識符添加一個(gè)雙引號""
@#的使用,我們添加一個(gè)普通的宏
//隨便寫一個(gè)宏
#define LRToast(str) [NSString stringWithFormat :"%@",str]
//這個(gè)宏需要這樣寫
LRToast(@"溫馨提示“”)饿敲;
NSLog(@"%@",LRToast(@"溫馨提示"))妻导;
強(qiáng)調(diào)下我只是隨便定義一個(gè)宏來做示例,以上代碼是正常的使用怀各,我們在來看看添加@#是怎么使用的.
//隨便寫一個(gè)宏
#define LRToast(str) [NSString stringWithFormat:@"%@",@#str]
//這個(gè)宏需要這樣寫
LRToast(溫馨提示);
//正常運(yùn)行, 打印不會(huì)報(bào)錯(cuò)
NSLog(@"%@",LRToast(溫馨提示));
我們可以看出來LRToast(@溫馨提示)與LRToast(@"溫馨提示")倔韭;區(qū)別,也就是說@#可以代替@"" 那么我們以后開發(fā)就省事了瓢对,不用再添加@""了J僮谩;
9.自動(dòng)布局Autolayout口訣
在stotyboard或者xib使用自動(dòng)布局硕蛹,如果控件比較多而且布局復(fù)雜醇疼,一不小心就會(huì)報(bào)一堆的錯(cuò)誤警告硕并,那么這個(gè)口訣是必備良藥,跟著這個(gè)口訣走再也不用害怕Autolayout恐懼癥了秧荆!
按照上圖從上而下順序讀就是當(dāng)前這條約束的狀態(tài)
First item(登錄按鈕的頂部)Relation(等于) Second item(父類View的頂部)Constant(加上10)Multiplier(乘以1)
10.APP迭代開發(fā)版本號的規(guī)則
在iOS中簡單的版本號是怎樣管理的呢倔毙?首先我們的App第一版本首次上線比如1.0.0位首次上線的版本號:
1)上線后突然發(fā)現(xiàn)一個(gè)嚴(yán)重的Bug那我們就需要修復(fù)更新版本,此時(shí)我們的版本號為1.0.1
所以說如果修復(fù)Bug或者優(yōu)化功能乙濒,我們只修改疊加第三個(gè)數(shù)字陕赃,其他不變
2)如果有了新的需求,在原來的基礎(chǔ)上增加一個(gè)新功能颁股,那么我們的版本號變位機(jī)1.1.0么库,需要清空第三位數(shù)字為0.來疊加修改第二位數(shù)字
3)如果APP需求功能大改,更新量非常大甘有,那我們的版本號變?yōu)?.0.0廊散,需要疊加修改第一個(gè)數(shù)字,清空其他數(shù)字為0.