
2015年2月1日,不允许提交不支持arm64的应用程序;在iOS10发行后,如果您的应用程序使用32位类和库,并且没有支持64位模型的相应库,则它将首次启动. 将会出现一个弹出提示: “ xxx可能会降低iPhone的速度...”; iOS 10.3公开Beta版: 阻止32位应用程序; Apple系统(iOS7 / iOS8-iOS9),32位框架和64位框架共存,因此,如果所有应用程序均为64位,则系统不会自动加载32位框架arm 64位处理器,因此占用的资源更少,这对于提高运行速度很有好处,也就是说,您会感觉到手机正在运行得更快. 在应用程序与64位系统兼容之后,内存使用量肯定会增加一点,但是性能得到了相应提高. 在32位时代,使用IPL32规范. 64位之后,它已更改为LP64规范. 在数据类型中,NSInteger在为32位时等效于int,而在为64位时等效于long. 该数据结构被广泛使用. 在许多非标准情况下,它将直接替换为int. 在32位中,没有问题,但是在64位中,这是一个隐藏的危险. CGFloat也有同样的问题. 如果使用偏移量访问结构项,则需要仔细检查. 其余的还是不错的. 当然,如果使用malloc,请检查分配的内存大小. 使用sizeof帮助进行计算. 方法调用中的更改: 在64位系统上运行时调用函数不同于32位系统. 主要区别在于,当传递带有可变数量参数的函数参数时,我们看下面的代码:
int fixedFunction(int a, int b);
int variadicFunction(int a, ...);
int main
{
int value2 = fixedFunction(5,5);
int value1 = variadicFunction(5,5);
}
第一个函数固定为传递2个参数,第二个函数是不确定参数的数量,正在使用中,
传入了两个参数. 在32位系统下,这两个函数的参数传递在64位中非常相似
在位系统下,两者是完全不同的. 该项目中使用的第三方库肯定需要支持64位系统,否则仍然徒劳. 每个人都需要检查他们使用的第三方库,以查看它们是否支持64位版本. 在Apple系统(iOS7 / iOS8-iOS9)中,32位框架和64位框架共存,因此,如果所有应用程序都是64位,则系统将不会自动加载32位框架,这会占用较少的资源,另外,它对运行速度有好处,也就是说,您会感觉到手机运行得更快. 该应用程序与64位系统兼容后,内存使用量肯定会增加一点,但是性能得到了相应的改善.
如果不确定该库是否支持arm64,则可以在cmd模式下使用file命令检查该库文件:
$lipo -info /Users/xxx/NHPushStreamSDK/FFmpeg-iOS/lib/libavcodec.a
//指令说明:lipo -info 静态库(动态库)文件完整路径
armv7,armv7s和arm64,i386,x86_64代表什么?
__臂处理器以其低功耗和小尺寸而闻名. 几乎所有的手机处理器都基于arm. 它在嵌入式系统中的应用非常广泛,在相同功耗的产品中其性能也非常好. 优秀.
Armv6,armv7,armv7s,arm64均为arm处理器的指令集,原则上所有指令集都向后兼容,例如iPhone4S CPU的默认指令集为armv7指令集,但也与armv6指令兼容设置上,仅使用armv6指令集不能充分发挥其性能,即不能使用armv7指令集的新功能,类似地,iPhone5处理器标准的armv7s指令集,也支持armv7指令集,但不能执行相关的性能优化,导致程序执行效率降低.
这些指令集对哪些设备有用?
arm64armv7sarmv7
iPhone6s
iPhone5
iPhone4
iphone6s plus

iPhone5C
iPhone4S
iphone6
iPad4(带有视网膜显示屏的iPad)
iPad
iphone6 plus
iPad2
iphone5s
iPad3(新iPad)
iPad Air
iPad mini
iPad mini2(带有Retina显示屏的iPad mini)
iPod Touch 3G
iPod Touch4
i386是用于Intel通用微处理器的32位处理器
x86_64是用于x86体系结构的64位处理器

i386架构是32位模拟器测试所必需的,
模拟器64位处理器测试需要x86_64体系结构,
真实机器的32位处理器需要armv7或armv7s架构,
真正的64位处理器需要arm64架构.
建筑
指定可以将项目编译为哪种指令集类型,并且它支持的指令集越多,将编译包含多个指令集代码的数据集越多,则生成的相应二进制包也越大,即,ipa程序包将更改(以空格分隔的标识符列表. 指定二进制文件所针对的体系结构(ABI,处理器模型). 当此构建设置指定多个体系结构时,生成的二进制文件可能包含每个指定体系结构的目标代码).
有效的体系结构
限制可能支持的指令集范围,即最终将由这些类型生成Xcode编译的二进制程序包的类型,以及哪些架构和有效架构将编译哪些指令集程序包(因此,这不能(为空)(以空格分隔的标识符列表. 指定可为其构建二进制文件的体系结构. 在构建过程中,此列表与ARCHS构建设置的值相交;结果列表指定二进制文件可以在其上运行的体系结构. 如果生成的体系结构列表为空,则目标不生成二进制文件. )
仅构建活动架构
指定是否仅编译当前连接设备支持的指令集
当值设置为YES时,此属性设置为yes,以便在调试时编译更快,它仅编译当前体系结构版本,而当设置为no时,它将编译所有版本. 因此,您可以选择在调试时将其设置为yes,并在发布时将其更改为no以适应不同的设备.
注意: 在Xcode6.1.1及更高版本的“有效体系结构”设置中,默认值为“标准体系结构”(armv7,arm64),如果要更改它,请在其他位置进行更改.
有效的体系结构集生成用于生成二进制程序包支持的指令集的体系结构集(取交集)
armv7,armv7s,arm64
armv7s
armv7s

armv7,armv7s
armv7s,arm64
armv7s
armv7,armv7s,arm64
armv6,armv7s,arm64
armv7s,arm64
armv6,armv7,armv7s
armv6,armv7s,arm64
armv6,armv7s
armv7,arm64,armv7s
armv7,arm64,armv7s
armv7,arm64,armv7s
armv7,armv7s,arm64
armv7,armv7s
armv7s,armv7
例如,有效体系结构支持的arm指令集的版本是: armv7 / armv7s / arm64,而相应体系结构所支持的arm指令集的版本是: armv7s. 此时,Xcode将仅生成armv7s指令集的二进制包. xcode默认设置:

架构: Strandard架构-$(ARCHS_STANDARD)//等同于arm64 armv7s armv7
有效的体系结构: arm64 armv7s armv7如果需要ipa安装软件包的大小,则可以减少安装软件包的指令集数量,因此可以尽可能减小软件包的大小.

自定义设置

系统默认设置
现在返回主题,如何使“没问题”. 静态库. 通过以上信息,我们了解到,在开发App时,为了追求更高的效率并减小程序包的大小,将Build Active Architecture Only Only设置为YES,可以根据Xcode默认配置架构,因为arm64是向前兼容的. 但是.a静态库的产生是不同的,因为要确保兼容性,包括在不同的iOS设备和模拟器上运行而不会出现错误,因此结合当前的行业状况,以实现最大的兼容性.
有效的架构设置为: armv7 | armv7s | arm64 | i386 | x86_64
架构设置保持不变(或根据您的需要): armv7 | arm64
然后分别选择iOS设备和模拟器进行编译,最后找到相关的.a软件包:
$ lipo -create /Users/xxxxxx/lib/libv7.a /Users/xxxxxx/lib/lib64.a -output /Users/xxxxxx/lib/lib.a
//指令说明: lipo -create 库文件1一完整路径 库文件2完整路径 -output 输出的文件名路径
Desktop$ lipo -thin arm64 debugserver -output debugserver2
//指令说明:lipo -thin 对应构架指令 对应文件 -output 输出的文件名路径
使用lipo-真实计算机库的create路径arm 64位处理器,库的路径.a-输出综合库的名称.a,以便创建通用的静态库.a.
有关制作动态库和静态库的详细信息,请参阅[link]
因此,如果某些程序中使用的静态库不支持armv7s,而您的项目支持armv7s,则将出现编译错误“ xxxx不包含(arm)armv7s slice: 架构armv7s的xxxxx”. 有两种方法可以解决此问题: 如果它是开源的,并且可以找到源代码,则可以使用源代码重新键入支持armv7s的libaray,或者直接在项目中使用源代码而不是静态库. . 如果它不是开源的,请等待第三方库的支持,或者暂时让您的项目不支持armv7. 此外,不运行手臂代码,该软件将被编译为x86可以运行的指令. 因此,在生成静态库时,将首先生成两个.a,一个用于i386在模拟器上运行,另一个用于在实际设备上运行,然后使用命令将两个.a合并为一个. 应该注意的是,iOS模拟器不运行arm指令集,并且x86指令集已编译并运行. 因此,仅在iOS设备上执行与该设备相对应的arm指令集. 连接的手机指令集从高到低匹配(arm64> armv7s> armv7).
一些资源链接
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-254341-1.html
就像炒大蒜
真的假的