Objective C++结构体复制异常:dict字段为空且调试报错
Objective-C++结构体复制后字典字段为空的问题解决
可能原因及验证方案
1. 调试器显示bug(实际值正常)
LLDB对Objective-C++结构体里的_Nullable对象指针偶尔会出现显示异常,<error: parent is NULL>很多时候只是调试器的问题,不是代码逻辑错误。先通过日志验证实际值:
// 赋值后立即打印日志 NSLog(@"varA.dict: %@ | 地址: %p", varA.dict, varA.dict); NSLog(@"varB.dict: %@ | 地址: %p", varB.dict, varB.dict);
如果日志里能正常输出varB.dict的内容和地址,那不用管调试器的报错,代码是正常的。
2. varA.dict本身就是nil
你先给varB.dict赋值新字典再覆盖的操作完全无效——如果varA.dict本身是nil,varB.dict = varA.dict;会直接把varB.dict置为nil,之前的新字典因为没有强引用会被立即释放。先确认varA.dict的状态:
if (varA.dict) { NSLog(@"varA.dict有效,引用计数: %lu", [varA.dict retainCount]); } else { NSLog(@"varA.dict本身就是nil"); }
3. 对象提前被释放
如果varA.dict是临时对象,或者被错误地release/置为nil,赋值给varB.dict后就变成野指针,调试器会显示为空。要检查:
- varA.dict是否被强引用持有(比如是某个类的
strong属性,或者你手动调用过[varA.dict retain]) - 赋值varB.dict之前,有没有代码把varA.dict置为nil或者释放
4. 结构体定义语法问题
确保你的结构体定义是合法的Objective-C++语法:
typedef struct { NSString *name; NSDictionary<NSString *, id> *_Nullable dict; } SomeStruct;
如果缺少typedef或者语法有误,编译器处理结构体复制时可能出现异常。
快速排查流程
- 用NSLog确认字典的实际内容和内存地址,排除调试器显示问题;
- 检查varA.dict在赋值前是否为有效对象;
- 验证varA.dict的生命周期,确保没有提前释放;
- 确认结构体定义的语法正确性。
内容的提问来源于stack exchange,提问作者Lucy Gu
相关产品推荐
相关产品推荐

