我正在使用第三方库来处理我正在处理的iOS项目,我在项目中留下一个警告,即在这行代码上
[NSNumber numberWithUnsignedLongLong:'oaut']
警告是
Multi-character character constant
我吮吸C,所以我不知道如何解决这个问题,但我确信修复相对容易。帮助
编辑:更多背景。
@implementation MPOAuthCredentialConcreteStore (KeychainAdditions)
- (void)addToKeychainUsingName:(NSString *)inName andValue:(NSString *)inValue {
NSString *serverName = [self.baseURL host];
NSString *securityDomain = [self.authenticationURL host];
// NSString *itemID = [NSString stringWithFormat:@"%@.oauth.%@", [[NSBundle mainBundle] bundleIdentifier], inName];
NSDictionary *searchDictionary = nil;
NSDictionary *keychainItemAttributeDictionary = [NSDictionary dictionaryWithObjectsAndKeys: (id)kSecClassInternetPassword, kSecClass,
securityDomain, kSecAttrSecurityDomain,
serverName, kSecAttrServer,
inName, kSecAttrAccount,
kSecAttrAuthenticationTypeDefault, kSecAttrAuthenticationType,
[NSNumber numberWithUnsignedLongLong:"oaut"], kSecAttrType,
[inValue dataUsingEncoding:NSUTF8StringEncoding], kSecValueData,
nil];
if ([self findValueFromKeychainUsingName:inName returningItem:&searchDictionary]) {
NSMutableDictionary *updateDictionary = [keychainItemAttributeDictionary mutableCopy];
[updateDictionary removeObjectForKey:(id)kSecClass];
SecItemUpdate((CFDictionaryRef)keychainItemAttributeDictionary, (CFDictionaryRef)updateDictionary);
[updateDictionary release];
} else {
OSStatus success = SecItemAdd( (CFDictionaryRef)keychainItemAttributeDictionary, NULL);
if (success == errSecNotAvailable) {
[NSException raise:@"Keychain Not Available" format:@"Keychain Access Not Currently Available"];
} else if (success == errSecDuplicateItem) {
[NSException raise:@"Keychain duplicate item exception" format:@"Item already exists for %@", keychainItemAttributeDictionary];
}
}
}
编辑2:他们试图通过创建NSNumber来满足此要求:
@constant kSecAttrType Specifies a dictionary key whose value is the item's
type attribute. You use this key to set or get a value of type
CFNumberRef that represents the item's type. This number is the
unsigned integer representation of a four-character code (e.g.,
'aTyp').
答案 0 :(得分:1)
在C和Obj-C中,单引号'
仅用于单字符常量。您需要使用双引号:"
像这样:
[NSNumber numberWithUnsignedLongLong:"oaut"]
这涵盖了警告,但这里也存在语义问题。虽然单个字符常量(例如'o'
)可以视为整数(并且可以提升为unsigned long long
),但“字符串”(char *
或char []
)不能,这意味着你不能使用"oaut"
作为numberWithUnsignedLongLong:
更新
我猜这个四字符代码应该被视为一个整数,即每个char
的8位就好像它们在一起是32位int
: / p>
char code[] = "oaut";
uint32_t code_as_int = code[0] | (code[1] << 8) | (code[2] << 16) | (code[3] << 24);
[NSNumber numberWithUnsignedLongLong:code_as_int]
虽然我不确定这里会出现哪种字节序,也不确定为什么要求unsigned long long
,除非只是确定有足够的位。
Rudy的评论,现在我认为是正确的 - 一些编译器允许多字符常量用于此目的(它是“实现定义的”行为)。
答案 1 :(得分:1)
'oaut'
(单引号)是一个字符,因此编译器会尝试将其解释为多字节字符,但无法理解它。这解释了错误消息。
我想如果你给了一个正确的字符串,比如@“oaut”,你会收到另一条错误信息,因为numberWithUnsignedLongLong:
需要unsigned long long
,而不是字符串或字符。您是否尝试传递名为“oaut”的变量?如果是这样,请使用
[NSNumber numberWithUnsignedLongLong: oaut];
如果没有,那么请解释“oaut”是什么。
修改强>
'oaut'
实际上可能是原始值。 C中存在多字符字符常量。使用(4字节)char
,用作int
并提升为unsigned long long
将是可能的。这必须是旧代码。似乎这样的代码被CodeWarrior接受了。
假设真的是一个多字符char const,'oaut'
看起来像一个“幻数”并选择了这个值,因为它是"oauth"
的开头。我想它应该是值0x6F617574或0x7475616F。
答案 2 :(得分:0)
[NSNumber numberWithUnsignedInt:'oaut']
在32位和64位cpu中, unsigned int
的长度为32位,这是Apple的一个实际例子:https://developer.apple.com/library/ios/samplecode/CryptoExercise/Listings/Classes_SecKeyWrapper_m.html