iOS 開發(fā)項(xiàng)目實(shí)戰(zhàn)小的技巧總結(jié)

1.既然有問題我們?cè)撛鯓咏鉀Q ?

首先大部分人都會(huì)去百度搜索來解決問題, 誰(shuí)都不例外, 可是百度這東西會(huì)有很多誤解, 甚至誤人子弟, 同時(shí)解決問題的效率也不是很高, 如果是技術(shù)問題可以去:

Google 簡(jiǎn)單來說比百度搜索的答案相對(duì)要多,要更準(zhǔn)確效率更高, 建議使用英文搜索

Stack Overflow 一個(gè)與程序相關(guān)的IT技術(shù)問答網(wǎng)站, 簡(jiǎn)單來說工作中的70%問題在這里都能解決

搜索是解決問題的一種辦法, 那么剩余30%的問題還是需要自己獨(dú)立去解決, 那么有人會(huì)問有沒有能提高獨(dú)立解決問題的辦法呢 ? 比如: 積累所遇到的崩潰信息, 學(xué)會(huì)查看崩潰信息, 查看官方文檔的技巧等等) 本文暫時(shí)不會(huì)詳解, 有時(shí)間的話需要單獨(dú)寫一篇文章來探究如何高效的解決崩潰問題!

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).png

全局?jǐn)帱c(diǎn)的目的就是當(dāng)產(chǎn)生異常或崩潰能夠停留在異?;蛘弑罎l(fā)生的地方而不是跳轉(zhuǎn)到主函數(shù)

崩潰斷點(diǎn).png

但是添加全局?jǐn)帱c(diǎn)后會(huì)跳轉(zhuǎn)到主函數(shù), 會(huì)遇到如上圖的情況, 那么80%的問題就是storyboard或者xib拖線沒有及時(shí)清理掉壞線如下圖:

拖線沒有清除.png

這條Button的連線在代碼中已經(jīng)刪除了不用了, 但是沒有及時(shí)清理掉,所以會(huì)造成崩潰!

3.NSString使用stringWithFormat拼接的相關(guān)知識(shí)

保留2位小數(shù)點(diǎn)

//.2代表小數(shù)點(diǎn)后面保留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);

字符串中有特殊符號(hào)%怎么辦

NSInteger count = 50;

//%是一個(gè)特殊符號(hào) 如果在NSString中用到%需要如下寫法

NSString *string = [NSString stringWithFormat:@"%zd%%",count];

//輸出結(jié)果是: 50%

NSLog(@"%@", string);

字符串中有特殊符號(hào)"怎么辦

NSInteger count = 50;

//"是一個(gè)特殊符號(hào), 如果在NSString中用到"需要用\進(jìn)行轉(zhuǎn)義

NSString *string = [NSString stringWithFormat:@"%zd\"",count];

//輸出結(jié)果是: 50"

NSLog(@"%@", string);

4.判斷是否為gif/png圖片的正確姿勢(shì)

首先我們先想想如果是你, 你會(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圖片

}

什么難道你不是這么判斷的么 ? 哦~ 我懂了, 難道你使用字符串截取來判斷的嗎 ? 哈哈開個(gè)玩笑!

以上判斷看似是可以的,但是這不嚴(yán)謹(jǐn)?shù)? 在不知道圖片擴(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 @"png";

case 0x47:

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:NSASCIIStringEncoding];

if ([testString hasPrefix:@"RIFF"] && [testString hasSuffix:@"WEBP"]) {

return @"webp";

}

return nil;

}

return nil;

}

其實(shí)圖片數(shù)據(jù)的第一個(gè)字節(jié)是固定的,一種類型的圖片第一個(gè)字節(jié)就是它的標(biāo)識(shí), 我們來調(diào)用一下這個(gè)方法:

//假設(shè)這是一個(gè)網(wǎng)絡(luò)獲取的URL

NSString *path = @"http://pic.rpgsky.net/images/2016/07/26/3508cde5f0d29243c7d2ecbd6b9a30f1.png";

NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:path]];

//調(diào)用獲取圖片擴(kuò)展名

NSString *string = [self contentTypeForImageData:data];

//輸出結(jié)果為 png

NSLog(@"%@",string);

5.Button禁止觸摸事件的2種方式

大家應(yīng)該知道, 有很多需求是在規(guī)定內(nèi)不允許點(diǎn)擊Button, 并且讓用戶知道這個(gè)按鈕是不可以點(diǎn)擊的,那我們應(yīng)該這樣設(shè)置:

//會(huì)改變按鈕的狀態(tài),顏色會(huì)變灰

button.enabled = NO;

但是又有一個(gè)需求是既不能點(diǎn)擊也不要改變Button顏色:

//保持按鈕原來的狀態(tài),顏色不會(huì)變

button.userInteractionEnabled = NO;

6.跟xib一起走過的坑

(1) 如果在xib中有一個(gè)控件, 已經(jīng)明確設(shè)置尺寸了,輸出的frame也是對(duì)的, 但是顯示出來的效果不一樣(比如尺寸變大了), 如果是這種情況一般就是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è)置圖片圓角?

首先你是否是這么設(shè)置的:

//cornerRadius 設(shè)置為self.iconImage圖片寬度的一半(圓形圖片)

self.iconImage.layer.cornerRadius = 20;

self.iconImage.layer.masksToBounds = YES;

或者是在xib&storyboard中點(diǎn)擊要設(shè)置圓角的圖片:

xib或者storyboard設(shè)置圓角.png

在此之后建議大家盡量不要這么設(shè)置, 因?yàn)槭褂脠D層過量會(huì)有卡頓現(xiàn)象, 特別是弄圓角或者陰影會(huì)很卡, 如果設(shè)置圖片圓角我們一般用繪圖來做:

/** 設(shè)置圓形圖片(放到分類中使用) */

- (UIImage *)cutCircleImage {

UIGraphicsBeginImageContextWithOptions(self.size, NO, 0.0);

// 獲取上下文

CGContextRef ctr = UIGraphicsGetCurrentContext();

// 設(shè)置圓形

CGRect rect = CGRectMake(0, 0, self.size.width, self.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值連接起來如下圖:

## 的使用.png

#的意思是緊跟著它的后面的標(biāo)識(shí)符添加一個(gè)雙引號(hào)""

@#的使用, 我們添加一個(gè)普通的宏:

//隨便寫一個(gè)宏

#define LRToast(str) [NSString stringWithFormat:@"%@",str]

//這個(gè)宏需要這樣寫

LRToast(@"溫馨提示");

NSLog(@"%@",LRToast(@"溫馨提示"));

強(qiáng)調(diào)下我只是隨便定義一個(gè)宏來做示例, 以上代碼是正常的使用,我們?cè)趤砜纯刺砑覢#是怎么使用的:

//隨便寫一個(gè)宏

#define LRToast(str) [NSString stringWithFormat:@"%@",@#str]

//這個(gè)宏需要這樣寫

LRToast(溫馨提示);

//正常運(yùn)行, 打印不會(huì)報(bào)錯(cuò)

NSLog(@"%@",LRToast(溫馨提示));

我們可以看出來 LRToast(溫馨提示);與LRToast(@"溫馨提示");區(qū)別, 也就是說@#可以代替@"" 那么我們以后開發(fā)就省事了, 不用再添加@""了!

9.自動(dòng)布局Autolayout口訣

在storyboard或者xib使用自動(dòng)布局, 如果控件比較多而且布局復(fù)雜, 一不小心就會(huì)報(bào)一大堆錯(cuò)誤警告, 那么這個(gè)口訣是必備良藥, 跟著這個(gè)口訣走再也不用害怕Autolayout恐懼癥了 !

Autolayout.png

按照如上圖從上到下順序讀就是當(dāng)前這條約束的狀態(tài)

First Item(登錄按鈕的頂部)Relation(等于) Second Item(父類View的頂部) Constant(加上 10)? Multiplier(乘以 1)

10.App迭代開發(fā)版本號(hào)的規(guī)則

在iOS中簡(jiǎn)單的版本號(hào)是怎樣管理的呢? 首先我們的App第一版本首次上線, 比如以1.0.0為首次上線的版本號(hào):

1.上線后突然發(fā)現(xiàn)一個(gè)嚴(yán)重的Bug那我們就要修復(fù)更新版本, 此時(shí)我們的版本號(hào)為1.0.1

所以說如果修復(fù)Bug或者優(yōu)化功能, 我們只修改疊加第三位數(shù)字, 其他不變

2.如果有了新的需求, 在原來的基礎(chǔ)上增加了一個(gè)新功能, 那么我們的版本號(hào)變?yōu)?.1.0, 需要清空第三位數(shù)字為0, 來疊加修改第二位數(shù)字

3.如果App需求功能大改, 更新量非常大, 那我們的版本號(hào)變?yōu)?.0.0, 需要疊加修改第一位數(shù)字, 清空其他數(shù)字為0

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容