joe:
說明:以下是我在做64位公升級的各個步驟,裡面的例子僅僅是該步驟的一些例子而已,大家可以舉一反三,而「提示」裡是一些個人心得而已。
1.配置專案檔案中相關的選項
(1)確保需要支援arm64的各個targets裡的general的deployment target是5.1.1或以上(因為ios 5.1.1或以上才開始支援arm64架構)
(2)確保targets裡的architectures和valid architectures 的有效值的合集包含armv7和arm64(這裡為什麼說有效值,是因為它的只會收到progect裡的值替代,如果是它空值的話)
(3)其他選項就沒什麼了,如果還有不對的話,xcode還是會給你相應的修改提示請求的
2.更新專案中的 *.framework 或者 *.a 等第三方庫
(2)在本地使用mac下的lipo命令檢查一下是否同時相容armv7和arm64
例子:lipo -info 庫檔案
(3)使用**比對工具對新舊庫的標頭檔案進行一下比對,檢查api是否發生了變化,並且做相應的介面變更工作
3.重寫專案中的.s字尾的彙編檔案
(1) 參照ios abi function call guide檢查並且重寫asm**
4.到了這個步驟後基本上就可以進行黑盒測試
(1)交給測試同學去做黑盒測試測試(這樣雖然對測試的同學是乙個很大的工作量,但是對於工程比較大的專案,從黑盒定位問題所在是代價成本是相對是比較低,除非有一套完善的自動化白盒或黑盒測試工具)
(2)當然了,接下來就是修復測試同學發現的相容性和適配性bug
[1].**的實現
例子1:
系統**:- (nsinteger)numberofrow;
實現**:- (int)numberofrow -> - (nsinteger)numberofrow
例子2:
自定義**:- (cgfloat)percentofrate;
實現** :- (float)numberofrow -> - (cgfloat)numberofrow
[2].修改了系統行為
例子:系統實現:- (void)setalpha:(cgfloat)alpha
覆蓋系統:- (void)setalpha:(cgfloat)alpha -> - (void)setalpha:(bool)alpha 用新類繼承該系統類,然後在新類裡覆蓋該方法
(3)最後就修復測試同學發現的邏輯性錯誤的bug
[1].位運算
例子1:
long a = 1 << (32-1); -> long a = 1 << (sizeof(long)-1); 只把long型別的a最低位的值保留到最高位,其他位清掉,很明顯在64位環境下邏輯是錯誤的
例子2:
nsuinteger max = ~0; -> nsuinteger max = ~((nsuinteger)0); 獲取無符號整形型別的最大值
[2].資料型別轉換
例子1:
b是b類的乙個例項,而c是b裡面的乙個nsinteger型別的成員變數
int a = b.c; -> nsinteger a = age;
例子2:
unsigned int a = 0;
int b = -1;
unsigned long c = a+b;
或 ->
unsigned int a = 0;
int b = -1;
unsigned long c = (long)(int)(a+b);
或 ->
unsigned int a = 0;
int b = -1;
unsigned long c = (unsigned long)(int)(a+b);
例子3:
unsigned int a = 0;
int b = -1;
long c = a+b;
或 ->
unsigned int a = 0;
int b = -1;
int c = a+b;
或 ->
unsigned long a = 0;
long b = -1;
long c = a+b;
或 ->
unsigned int a = 0;
int b = -1;
long c = (int)(a+b);
例子4:
nsuinteger nua = 1;
nsinteger na = -1;
unsigned int ua = 1;
int ia = -1;
cgfloat cf = .1f;
float f = .1f;
nslog(@"%u %d %u %d %f %f", nua, na, ua, ia, cf, f);
->
nslog(@"%lu %ld %u %d %lf %f", (unsigned long)nua, (long)na, ua, ia, (double)cf, f);
[3].指標出錯:
例子:void func()
int *ptr = func;
ptr();
->
void func()
long *ptr = func;
if(sizeof(func)==sizeof(long)) ((long)ptr)();
else if(sizeof(func)==sizeof(long)) ((int)ptr)();
else return;
[4].變長函式轉定長函式
例子:void(mylog*)(nsstring *, int, int) = (void(*)(nsstring *, int, int))nslog;
mylog(@"%d",1);
->
#define mylog(format, int1, int2) nslog((nsstring *)(format), (int)(int1), (int)(int2));
mylog(@"%d %d",1,1);
本人剛剛參與實習,望大家不捨自己的個人建議,本人很願意跟大家交流 ^-^
ios 編譯openssl支援arm64
最近在編譯支付寶 快捷支付 無線 ios 端的時候發現demo不支援arm64。在網上找了下,看到客服說是openssl的庫檔案不支援arm64,於是自己編譯了支援arm64的庫檔案,發現還是不行,提示原來 的庫檔案也不支援。問他們客服,缺遲遲不給出解決方案,到後面居然連話都不回了。以上都是題外話,...
ios 編譯openssl支援arm64
最近在編譯支付寶 快捷支付 無線 ios 端的時候發現demo不支援arm64。在網上找了下,看到客服說是openssl的庫檔案不支援arm64,於是自己編譯了支援arm64的庫檔案,發現還是不行,提示原來 的庫檔案也不支援。問他們客服,缺遲遲不給出解決方案,到後面居然連話都不回了。以上都是題外話,...
ios 編譯openssl支援arm64
最近在編譯支付寶 快捷支付 無線 ios 端的時候發現demo不支援arm64。在網上找了下,看到客服說是openssl的庫檔案不支援arm64,於是自己編譯了支援arm64的庫檔案,發現還是不行,提示原來 的庫檔案也不支援。問他們客服,缺遲遲不給出解決方案,到後面居然連話都不回了。以上都是題外話,...