iOS 不兼容的指针类型(来自 NSDictionary 的 NSMutableDictionary)

Posted

技术标签:

【中文标题】iOS 不兼容的指针类型(来自 NSDictionary 的 NSMutableDictionary)【英文标题】:iOS Incompatible Pointer Types (NSMutableDictionary from NSDictionary) 【发布时间】:2014-01-08 05:04:30 【问题描述】:

我遇到了一个问题,我只使用NSMutableDictionaries,但在从Core Data 保存/提取数据的某个地方,它变成了我无法编辑的NSDictionary。代码如下:

查看控制器 A

@property NSMutableDictionary *myDictionary;
@synthesize myDictionary;
myDictionary = [NSMutableDictionary new];

//Pull dictionary data in IBAction from somewhere else
APPOtherViewController *source = [segue sourceViewController];
myDictionary = source.otherDictionary; //other dictionary is also NSMutableDictionary

//On a button press, I save this dictionary to a Core Data transformable attribute (using MR_shorthand):
APPMyObject *newObject = [APPMyObject createEntity];
newObject.coreDictionary = myDictionary;
[[NSManagedObjectContext defaultContext]saveToPersistentStoreAndWait];

然后我根据设置的属性将 CD 实体拉到新的视图控制器中...

视图控制器B

@property NSMutableDictionary *myDictionary;
@synthesize myDictionary;
myDictionary = [NSMutableDictionary new];

APPMyObject *details = [APPMyObject findFirstByAttribute:@"myName" withValue:myName];
myDictionary = details.coreDictionary;

警告出现在最后一行,“不兼容的指针类型从 'NSDictionary' 分配给 'NSMutableDictionary'。一切都编译并运行良好,但警告存在原因。

如果这是基础知识,请原谅我,但是为什么将字典保存到 Core Data 会将其从可变更改为不可变?如果我将所有内容都更改为NSDictionary,它可以正常工作,但是我无法编辑信息并重写。

谢谢!

【问题讨论】:

NSMutableDictionary *myDictionary;; myDictionary=[myDictionary initWithDictionary:details.coreDictionary] myDictionary = (NSMutableDictionary*)details.coreDictionary;使用它会处理警告 【参考方案1】:

在这种情况下,您可以使用它来代替myDictionary = details.coreDictionary;

myDictionary = [NSMutableDicationary dictionaryWithDictionary:details.coreDictionary];

更新: 我看到myDictionary = [NSMutableDictionary new];,这条线完全浪费了。即使您分配给 NSMutableDictionary,在使用details.coreDictionary 分配期间,它也会尝试使用NSMutableDictionary 变量分配NSDictionary 对象,这意味着myDictionary 尝试指向NSMutableDictionary 内存,这会导致编译时错误。还将类型转换为 NSMutableDictionarymyDictionary = (NSMutableDictionary*)details.coreDictionary;,暂时解决您的问题,但类型转换不正确。分配它后,当您尝试访问 NSMutable 方法时,它会崩溃。

【讨论】:

谢谢!你能简单解释一下为什么我必须重新定义 NSMutableDictionary 吗?当我最初将 myDictionary 保存到 Core Data 时,它是否将其更改为 NSDictionary?

以上是关于iOS 不兼容的指针类型(来自 NSDictionary 的 NSMutableDictionary)的主要内容,如果未能解决你的问题,请参考以下文章

iOS不兼容的块指针类型问题

Stripe iOS SDK - 发送不兼容的块指针类型

iOS - AFNetworking GET 方法中不兼容的块指针类型

ios 不兼容的指针类型从 NSError _autoreleasing 分配给 NSError _strong

在 iOS 7 之前的项目中编译警告“不兼容的指针类型初始化 'UIImage *' 使用类型为'CIImage * _Nullable”的表达式

iOS 5 SDK 中关于使用不兼容的指针类型初始化的新编译器警告