arm64的适配问题,这次真醉了

写过tableView的童鞋都知道,有必须的两个代理方法要实现,还有几个选择实现的。

必须实现的代理方法:

~设置行数

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

 

~初始化并设置cell样式及内容

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

 

 

选择实现的代理方法:

~设置列表分组数

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

 

~设置每行高度

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

 

 

当然还有其他的,这里就不在粘贴了,注意这里列出的最后一个可选代理方法,这是个隐藏已久的坑。今天就来说说这个

 

话说今天处理iPhone 64位系统出现的弹框问题,在首次安装程序时会弹出警告的问题。

 

弹出警告的原因是程序在编写时,未添加ARM给64的指令集,也就是“arm64”,用到该指令集的手机类型如下列出

 

iPhone6s、iphone6s plus
iPhone6、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。如果你也遇到了,欢迎参考与指教。

另外个人新开了博客网站,欢迎路过。

分享曾经的收获

 

 

 

posted @ 2017-02-17 10:51  BuddyLiu  阅读(717)  评论(0编辑  收藏  举报