arm64的適配問題,此次真醉了

寫過tableView的童鞋都知道,有必須的兩個代理方法要實現,還有幾個選擇實現的。數組

必須實現的代理方法:iphone

~設置行數網站

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;

 

~初始化並設置cell樣式及內容ui

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;

 

 

選擇實現的代理方法:spa

~設置列表分組數3d

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;              // Default is 1 if not implemented

 

~設置每行高度代理

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;

 

 

固然還有其餘的,這裏就不在粘貼了,注意這裏列出的最後一個可選代理方法,這是個隱藏已久的坑。今天就來講說這個code

 

話說今天處理iPhone 64位系統出現的彈框問題,在首次安裝程序時會彈出警告的問題。blog

 

彈出警告的緣由是程序在編寫時,未添加ARM給64的指令集,也就是「arm64」,用到該指令集的手機類型以下列出 ip

 

iPhone6s、iphone6s plus
iPhone六、iPhone6 plus
iPhone5S
iPad Air、iPad mini2(iPad mini with Retina Display)

 

注:摘自iOS中的armv7,armv7s,arm64,i386,x86_64都是什麼

 

解決方法就是添加arm64到項目配置中:路徑是Targate->Build Settings->Architechtures, 配置以下

 

添加以前的配置:

 

添加以後的配置:

 

可是,這只是個開始,Command+B以後,居然Build failed了。

 

程序不只有眼前的bug,還有遠方未知的坑和改需求,但眼前的bug要先改完。

 

此次failed跟以往的不同,先來看一段代碼

 

NSInteger numberOfArray = [testDic[@"testId"] count];
return numberOfArray;

 

這時段示例代碼,假設有個字典鍵「testId」對應的值是一個數組,使用「[]」語法取數組的count值,按說是不該該出錯的

可是這裏確實出錯了,提示大體意思是:不能有多個方法訪問count屬性

必須寫成下面的形式才能夠經過:

NSInteger numberOfArray = [((NSArray *)testDic[@"testId"]) count];  //此處強轉,只取數組的個數沒問題,若是改數組就會出問題
或者
NSArray *testArray = testDic[@"testId"];
NSInteger numberOfArray = [testArray count];

 

沒辦法,只能一個一個修改。去除左邊框框裏的全部紅色後,終於Build Succeeded

 

------------------------------------------------------------

 

進入後感受如釋重負,終於又幹掉一個bug,因而像往常同樣點了點幾個主界面。

點到一個列表時,列表和個人心情都簡直了😅 。。。😢...

 

這是屬於個人戰場,大戰在即,開啓全面警惕

半小時過去了,同事問我「好了嗎?」 --- 我伸個懶腰:「還沒」

。。。

一個小時過去了

「好啦?」 --- 「我去一下廁所,減減壓」

··· ···

 

是這個方法沒作系統版本判斷嗎?

- (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size lineBreakMode:(NSLineBreakMode)lineBreakMode NS_DEPRECATED_IOS(2_0, 7_0, "Use -boundingRectWithSize:options:attributes:context:") __TVOS_PROHIBITED; // NSTextAlignment is not needed to determine size

 

 

改爲下面的方法(參考:boundingRectWithSize:options:attributes:計算文本尺寸的使用

- (CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options attributes:(nullable NSDictionary<NSString *, id> *)attributes context:(nullable NSStringDrawingContext *)context NS_AVAILABLE(10_11, 7_0);

 

 

然而,並無什麼 用

··· ···

一個半小時過去了

 

忽然,想起了同事說過的一個坑,「我遇到那個這是個老坑了,別人跟我說的‘你看這裏,加個CG就能夠了’」。

 

而後我就去翻了翻那幾個代理方法,就是在本文開始的時候特別提過的那個代理方法

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath; 

 

可是程序中並非這麼寫的,而是

- (float)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath; 

 

原來,這個代理方法在之前的返回值並非CGFloat,而是一個float。

在iOS不斷修改的過程當中,爲適應32位系統和64位系統,float和double被替換爲CGFloat(注意此處不是宏定義,參考:iOS typedef究竟是什麼?),以下官方解釋

CGFloat is just a typedef for either float or double.
typedef float CGFloat;// 32-bit
typedef double CGFloat;// 64-bit

 

好了,終於改掉了一個bug。若是你也遇到了,歡迎參考與指教。

另外我的新開了博客網站,歡迎路過。

分享曾經的收穫

相關文章
相關標籤/搜索