iOS工程支援arm64bit

2021-06-28 00:45:55 字數 3105 閱讀 8516

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的庫檔案,發現還是不行,提示原來 的庫檔案也不支援。問他們客服,缺遲遲不給出解決方案,到後面居然連話都不回了。以上都是題外話,...