之前在另一家公司的時(shí)候痹屹,就打包上傳APP到AppStore上面责嚷,第一次上傳成功(2015年2月1號(hào)之前),不過悲劇的是第一次被拒了(因?yàn)橛形⑿诺顷懗辏脩魶]有安裝微信的時(shí)候還是顯示微信登陸按鈕憔儿,不夠友好)
PS:如果用戶沒有安裝微信 但是你們APP有微信登陸的話請(qǐng)把微信登陸按鈕隱藏了畏邢。然后過了幾天又重新提交分预,已經(jīng)提交不上去了(已經(jīng)過了2月1號(hào)了)趴梢,不過后來老板也不說再上傳這個(gè)APP了敬察,然后就不了了之了秀睛。后來,又來到了現(xiàn)在這家公司莲祸,經(jīng)過兩個(gè)多月蹂安,修改bug的任務(wù)完成了,準(zhǔn)備著今天提交APP進(jìn)行審核呢锐帜,可是提交的時(shí)候提示不支持arm64田盈,于是乎,在building setting里面加上了arm64缴阎,編譯之后報(bào)錯(cuò)(由于使用了zbar這個(gè)二維碼掃描的類庫允瞧,由于之前的沒有兼容arm64所以現(xiàn)在報(bào)錯(cuò)了,于是百度了一個(gè)支持arm64的靜態(tài)庫把之前的替換了)∈鲈荩可是痹升,扯淡的問題出現(xiàn)了,首頁的數(shù)據(jù)竟然不顯示了畦韭,然后就冥思苦想疼蛾,仔細(xì)看項(xiàng)目代碼,原來- (CGFloat)tableView:(UITableView*)tableView heightForRowAtIndexPath:(NSIndexPath*)indexPath這個(gè)方法寫的是- (float)tableView:(UITableView*)tableView heightForRowAtIndexPath:(NSIndexPath*)indexPath
返回的是float艺配,返回的是float察郁,返回的是float,重要的事情要說三遍转唉,他坑了皮钠。于是又研究了一下arm64編譯環(huán)境和之前的差異。
說了那么多的廢話赠法,正式開始
拒絕基本數(shù)據(jù)類型和隱式轉(zhuǎn)換
首當(dāng)其沖的就是基本類型麦轰,比如下面4個(gè)類型在32-bit和64-bit下分別是多長呢?
size_t s1 =sizeof(int);
size_t s2 =sizeof(long);
size_t s3 =sizeof(float);
size_t s4 =sizeof(double);
32-bit下:4, 4, 4, 8期虾;64-bit下:4, 8, 4, 8
(PS: 這個(gè)結(jié)果隨編譯器原朝,換其他平臺(tái)可不一定)
它們的長度變化可能并非我們對(duì)64-bit長度加倍的預(yù)期,所以說镶苞,程序中出現(xiàn)sizeof的代碼多看兩眼喳坠。而且,除非你明確知道自己在做什么茂蚓,應(yīng)該使用下面的類型代替基本類型:
int -> NSInteger
unsigned -> NSUInteger
float -> CGFloat
動(dòng)畫時(shí)間 -> NSTimeInterval…
這些都是SDK中定義的類型壕鹉,而我們大部分時(shí)間都在跟SDK的API們打交道,使用它們能將類型轉(zhuǎn)換的影響降低很多聋涨。
再比如說下面的代碼:
NSArray*items=@[@1,@2,@3];
for(inti = -1; i < items.count; i++)?{
? ? NSLog(@"%d", i);
}
結(jié)果是晾浴,for循環(huán)一次都沒有進(jìn)。
數(shù)組的count是NSUInteger類型的牍白,-1與其比較時(shí)隱式轉(zhuǎn)換成NSUInteger脊凰,變成了一個(gè)很大的數(shù)字:
(lldb) p i
(int)$0= -1
(lldb) p?(NSUInteger)i
(NSUInteger)$1=18446744073709551615
這和64-bit到?jīng)]啥關(guān)系,想要說明的是茂腥,這種隱式轉(zhuǎn)換也需要小心狸涌,一定要注意和這個(gè)變量相關(guān)的所有操作(賦值、比較最岗、轉(zhuǎn)換)
老式for循環(huán)可以考慮寫成:
for(NSUIntegerindex=0;index< items.count;index++) {}
當(dāng)然帕胆,數(shù)組遍歷還是更推薦用for-in或block版本的,它們之間的比較可以回顧下這篇文章般渡。
使用新版枚舉
和上面的原因差不多懒豹,枚舉應(yīng)該使用新版的寫法:
typedefNS_ENUM(NSInteger, UIViewAnimationCurve)
?{? ? UIViewAnimationCurveEaseInOut,
? ? UIViewAnimationCurveEaseIn,
? ? UIViewAnimationCurveEaseOut,
? ? UIViewAnimationCurveLinear
};
不僅能為枚舉值指定類型芙盘,而且當(dāng)賦值賦錯(cuò)類型時(shí),編譯器還會(huì)給出警告脸秽,沒理由不用這種寫法儒老。