概述
tips:
相信目前大部分APP的工程框架已经是支持64bit,但是就在几天前,遇到一个公司几年前的框架,SQLCipher数据库加密,AES加密,ASI网络请求,JSONKit,ZipArchive。。全是32bit,全打包成了.a静态库,我曹,如果让工程支持64bit,那我岂不是要重新引入这些三方 /吓?但在废弃这个框架之前,确实需要这么干。
正文:
好在大部分用来打包.a文件的源文件都在gitlab上,我还能找到,这算是不幸中的万幸
1、AES替换,无问题
2、ASI替换,在”Target”->”Build Phases”->”Compile Source”中所有ASI 文件的compile Flags 设置”-fno-objc-arc” 兼容ARC
3、JSONKit替换,同2、
4、ZipArchive替换,同2、
error1:
当到这里的时候,编译发现一个错误”Implicit declaration of function ‘NSFileTypeForHFSTypeCode’ is invalid in C99”,
这是FMDB的问题,FMDatabaseAdditions.m中存在如下一段代码:我们需要在代码的外面做预编译处理
#if TARGET_OS_MAC && !TARGET_OS_IPHONE // 添加预编译处理
- (NSString*)applicationIDString {
NSString *s = NSFileTypeForHFSTypeCode([self applicationID]);
assert([s length] == 6);
s = [s substringWithRange:NSMakeRange(1, 4)];
return s;
}
- (void)setApplicationID:(uint32_t)appID {
NSString *query = [NSString stringWithFormat:@"PRAGMA application_id=%d", appID];
FMResultSet *rs = [self executeQuery:query];
[rs next];
[rs close];
}
- (void)setApplicationIDString:(NSString*)s {
if ([s length] != 4) {
NSLog(@"setApplicationIDString: string passed is not exactly 4 chars long. (was %ld)", [s length]);
}
[self setApplicationID:NSHFSTypeCodeFromFileType([NSString stringWithFormat:@"'%@'", s])];
}
#endif // 结束
5、SQLCipher替换,重新配置了一个,详情见https://www.zetetic.net/sqlcipher/ios-tutorial/
error 2:
这个时候又出现了另一个问题crash:
NSInvalidArgumentException -[__NSTaggedPointerString unsignedLongLongValue]: unrecognized selector sent to instance
定位到实体中的字典转模型方法中:
- (instancetype)initWithDictionary:(NSDictionary *)dictionary
{
self = [super init];
if (self) {
_undefinedProperties = [NSMutableDictionary dictionary];
[dictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
DCProperty *property = [[self class] propertyDictionary][key];
Class class = NSClassFromString(property.type);
if ([class isSubclassOfClass:[DCObject class]]) {
DCObject *object = [[class alloc] initWithDictionary:obj];
[self setValue:object forKey:key];
}
else if (![obj isEqual:[NSNull null]]) {
[self setValue:obj forKey:key]; ---------crash的地方
}
}];
}
return self;
}
这个问题,是因为64bit中,NSString 中没有unsignedLongLongValue这个方法了, 而当字典中obj的类型是NSString类型,实体中的key对应的属性是NSUinteger类型,setValue:obj forKey:key 会自动做如下处理:
[obj unsignedLongLongValue] 将value转为对应的属性类型,这就导致64bit中找不到该方法而crash。我的解决是,对NSString写一个category,重新写一个unsignedLongLongValue的方法:
-(NSUinteger)unsignedLongLongValue {
return [self integerValue];
}
或者 避免 让系统做NSString->NSUInteger的类型装换
最后
以上就是俊秀跳跳糖为你收集整理的iOS 工程 兼容64位 容易遇到的问题的全部内容,希望文章能够帮你解决iOS 工程 兼容64位 容易遇到的问题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复