带有不可复制的UIView键(使用CFDictionary)的NSMutableDictionary在iOS SDK 6上崩溃,但在5.1上却没问题

时间:2012-09-11 17:13:35

标签: objective-c nsmutabledictionary ios6

所以我使用了发现here的NSMutableDictionary的TLMutableDictionaryNoncopiedKeys类别,它允许使用不可复制的对象作为字典的键(我需要对象到对象的映射)。一切都很好,直到我在iOS 6中被告知应用程序崩溃。所以我下载XCode 4.5与iOS 6进行测试,看起来CFDictionary函数存在一些问题。如果我将UIView作为键传递(在我的类别方法中),它会崩溃:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIView copyWithZone:]: unrecognized selector sent to instance 0x719ff70'

AppCode调试器的更多细节:

objc_exception_throw
-[NSObject(NSObject) doesNotRecognizeSelector:]
__forwarding__
_CF_forwarding_prep_0
-[__NSDictionaryM setObject:forKey:]
-[NSMutableDictionary __addObject:forKey:]
CFDictionaryAddValue
-[NSMutableDictionary(TLMutableDictionaryNoncopiedKeys) setObject:forUncopiedKey:]

我做了一个测试项目。它适用于iOS 5.1模拟器,但与6崩溃。

有人可以对此有所了解吗?

完整项目为here。以下是一些列表:

类别:

#import <Foundation/Foundation.h>


@interface NSMutableDictionary (TLMutableDictionaryNoncopiedKeys)

- (void)setObject:(id)anObject forUncopiedKey:(id)aKey;

@end

----------------------------------------------------------------------

#import "NSMutableDictionary+TLMutableDictionaryNoncopiedKeys.h"

@implementation NSMutableDictionary (TLMutableDictionaryNoncopiedKeys)

- (void)setObject:(id)anObject forUncopiedKey:(id)aKey
{
    CFMutableDictionaryRef selfCF = (CFMutableDictionaryRef)self;
    Boolean keyAlreadySet = CFDictionaryContainsKey(selfCF, aKey);
    if (keyAlreadySet) {
        CFDictionaryReplaceValue(selfCF, aKey, anObject);
    }
    else {
        CFDictionaryAddValue(selfCF, aKey, anObject);
    }
}

@end

用法:

#import "NSMutableDictionary+TLMutableDictionaryNoncopiedKeys.h"
...
NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
UIView *key = [[UIView alloc] init];
[dict setObject:key forUncopiedKey:key];

0 个答案:

没有答案