gpt4 book ai didi

ios - base64EncodedStringWithOptions 在 SenTest 上崩溃

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:50:13 35 4
gpt4 key购买 nike

我在使用 SenTestCase 对象内的测试期间似乎只会崩溃的函数时遇到问题。

我想做的是从 NSData 对象(实际上是序列化的 JSON 字典)中获取 base64 编码的字符串。

下面代码中实际发生的是 NSJSONSerialization 创建一个 NSConcreteData 对象,然后在 [dataFromDictionary base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength]

上崩溃

返回的崩溃是test failure: -[NSConcreteData base64EncodedStringWithOptions:]: unrecognized selector sent to instance

(in my SenTestCase implementation)
-(NSString *)paramsAsString {
NSDictionary *storedParams = @{@"stringKeyTest":@"testValueString", @"dictionaryKeyTest":@{@"testDictKey":@"testDictValue"}, @"numberKeyTest":@1 };
NSError *error = nil;
BOOL paramCheck = [NSJSONSerialization isValidJSONObject:storedParams];
//paramCheck is true
NSData *dataFromDictionary = [NSJSONSerialization dataWithJSONObject:storedParams options:0 error:&error];
//dataFromDictionary is actually NSConcreteData
NSString *stringFromData = [dataFromDictionary base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
//should stringify NSData, actually crashes

return stringFromData; //never reached
}

我一直在谷歌搜索和 stackOverflowing 周围,我的测试目标可能缺少依赖项或 header 。我只是不明白那是什么。这些不都是Foundation框架的功能吗?

目标中也设置了-all-load-ObjC标志,出现同样的错误。

更新:在撰写本文时,我找到了解决此错误的方法。为后代保留帖子,以防万一我找到了次优的解决方案。

原来 SenTest 是一个转移注意力的问题。真正导致问题的是构建目标(在测试模拟器中为 6.1,在我的开发设备上为 7.0)实际上无法访问新公开的 iOS 7 方法。

我在 base64EncodedStringWithOptions: 的文档中看到了这个:

Although this method was only introduced publicly for iOS 7, it has existed since iOS 4

因为我计划支持 iOS 5 及更高版本,所以我添加了我自己的 base64 编码/解码实现(基于 Matt Gallagher's implementation),现在一切都很好。

这是向后不兼容的简单情况。一个很好的教训,以后要牢记在心。

最佳答案

如您所述,base64EncodedStringWithOptions 是一种 iOS 7 方法。如果需要,您可以使用第三方 base-64 库,但 Apple 公开了以前的私有(private)方法 base64Encoding,以向后兼容旧的 iOS 版本。因此,您可以:

NSString string;

if ([data respondsToSelector:@selector(base64EncodedStringWithOptions:)]) {
string = [data base64EncodedStringWithOptions:kNilOptions]; // iOS 7+
} else {
string = [data base64Encoding]; // pre iOS7
}

并转换回来:

NSData *data;

if ([NSData instancesRespondToSelector:@selector(initWithBase64EncodedString:options:)]) {
data = [[NSData alloc] initWithBase64EncodedString:string options:kNilOptions]; // iOS 7+
} else {
data = [[NSData alloc] initWithBase64Encoding:string]; // pre iOS7
}

关于ios - base64EncodedStringWithOptions 在 SenTest 上崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21392190/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com