警告:“将‘NSObject *’发送到不兼容类型‘id<NSCopying>’的参数

AC *_*han 3 objective-c nsdictionary nscopying ios ios7

我在这个警告中震惊了好几个小时......我越来越

代码是,

-(NSMutableDictionary*)iOSDiction
        {
            NSMutableDictionary *tmpDic = [[NSMutableDictionary alloc] initWithCapacity:[m_coordDic count]];
            for (NSObject *key in [m_coordDic allKeys]) 
            {
                [tmpDic setObject:[m_coordDic objectForKey:key] forKey:key];  //Warning
            }
            return tmpDic;
        }
Run Code Online (Sandbox Code Playgroud)

警告 :

“将‘NSObject *’发送到不兼容类型‘id’的参数

aKey在此处将参数传递给参数

NSDictionary.h

- (void)setObject:(id)anObject forKey:(id <NSCopying>)aKey;
Run Code Online (Sandbox Code Playgroud)

Ros*_*han 5

NSDictionary密钥应符合NSCopying协议。这是NSDictionary参考中指定的密钥的基本要求。一般来说,NSObject不符合协议(它的子类可能),所以你会收到警告。正确的做法是

NSMutableDictionary *tmpDic = [[NSMutableDictionary alloc] initWithCapacity:[m_coordDic count]];
for (NSObject<NSCopying> *key in [m_coordDic allKeys]) 
{
    [tmpDic setObject:[m_coordDic objectForKey:key] forKey:key];  //Warning
}
return tmpDic;
Run Code Online (Sandbox Code Playgroud)

这确保您的密钥是任何确认NSCopying协议的对象。

编辑:看来你真正想做的只是[m_coordDic mutableCopy]一个浅拷贝。你有什么理由不这样做?