【问题标题】:Error while setting object in NSMutableDictionary via lldb通过 lldb 在 NSMutableDictionary 中设置对象时出错
【发布时间】:2017-12-15 09:23:46
【问题描述】:

在调试时,我需要替换不可变字典中的值。 为此,我从不可变创建了一个可变字典,并尝试使用lldb 命令为此设置一个值:

po NSMutableDictionary *$tmp = [(NSDictionary *) immutableDict mutableCopy]
po [$tmp setObject:@"object" forKey:@"key"]

但是lldb 失败并出现错误:

error: cannot initialize a parameter of type 'id<NSCopying> _Nonnull' with an rvalue of type 'NSString *' passing argument to parameter 'aKey' here

有人知道怎么解决吗?

【问题讨论】:

  • 能告诉我们你是如何初始化 immutableDict 的吗?
  • @HiteshSultaniya 它初始化了一些在应用程序中,我在断点处捕获它
  • 好的,你能在 immutableDict 中添加什么吗?
  • 最新的 Xcode 9 不能让它失败。你使用的是什么版本的 Xcode?​​span>
  • @HiteshSultaniya 字符串键和字符串值

标签: objective-c lldb


【解决方案1】:

你应该使用这个脚本:

expression [mutableDict setValue:@"newObject" forKey:@"key"];

这是setObject:forKey: 定义:

- (void)setObject:(ObjectType)anObject forKey:(KeyType <NSCopying>)aKey;

密钥应遵循NSCopying 协议。

setValue:forKey: 定义:

- (void)setValue:(nullable ObjectType)value forKey:(NSString *)key;

类的关键类型NSString

【讨论】:

    【解决方案2】:

    往这边走,

    NSDictionary *dictTemp = [[NSDictionary alloc] initWithObjects:@[@"Value1",@"value2"] forKeys:@[@"Key1",@"Key2"]];
    NSMutableDictionary *mutableDict = [[NSMutableDictionary alloc] initWithDictionary:dictTemp];
    

    使用 lldb 输出,

    Printing description of mutableDict:
    {
        Key1 = Value1;
        Key2 = value2;
    }
    (lldb) po [mutableDict setObject:@"Value3" forKey:@"Key3"]
    (lldb) po mutableDict
    {
        Key1 = Value1;
        Key2 = value2;
        Key3 = Value3;
    }
    
    (lldb) 
    

    【讨论】:

      【解决方案3】:

      如果您在 Xcode 10 中遇到此问题,则调试器中似乎存在一个缺陷,有时(但并非总是)无法执行在编译代码中忠实发生的必要类型强制。它并不总是发生的事实使得它在发生时特别令人不安,而且关于它的文章很少。

      我不完全了解细节,但幸运的是有一个简单的解决方法。 (至少每次我遇到它时它都对我有用。)只需将密钥的类型转换为id,如下所示:

      (lldb) expr check[(id)@"check_id"]= @"383027"
      (NSTaggedPointerString *) $6 = 0xb0b97b49f6ae12f7 @"383027"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-08
        • 1970-01-01
        相关资源
        最近更新 更多