我已经定义了一个结构,并且想将它的一个值赋给一个NSMutableDictionary。当我尝试时,我得到一个EXC_BAD_ACCESS。下面是代码:什么是结构中的NSString?
//in .h file
typedef struct {
NSString *valueOne;
NSString *valueTwo;
} myStruct;
myStruct aStruct;
//in .m file
- (void)viewDidLoad {
[super viewDidLoad];
aStruct.valueOne = @"firstValue";
}
//at some later time
[myDictionary setValue:aStruct.valueOne forKey:@"key1"]; //dies here with EXC_BAD_ACCESS
这是在调试器控制台输出:
(gdb) p aStruct.valueOne
$1 = (NSString *) 0xf41850
有没有办法告诉什么aStruct.valueOne的价值是什么?
既然是NSString,为什么字典有这样的问题呢?
-------------编辑-------------
此编辑基于下面的一些评论。
该问题似乎出现在结构内存分配中。正如其中一条评论所述,我没有将结构值赋给viewDidLoad中的字典的问题。问题是,后来我遇到了一个关于结构的问题。就在错误之前,我做的:
po aStruct.oneValue
Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_PROTECTION_FAILURE at address: 0x00000000
0x9895cedb in objc_msgSend()
The program being debugged was signaled while in a function called from GDB.
GDB has restored the context to what it was before the call.
To change this behavior use "set unwindonsignal off"
Evaluation of the expression containing the function (_NSPrintForDebugger) will be abandoned.
这只是EXC_BAD_ACCESS之前发生:
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"MM-dd-yy_HH-mm-ss-A"];
NSString *date = [formatter stringFromDate:[NSDate date]];
[formatter release];
aStruct.valueOne =日期;
所以内存问题最有可能在我发布格式化程序。日期var没有保留。我应该做的
NSString *date = [[formatter stringFromDate:[NSDate date]] retain];
哪些工作,但然后我留下了内存泄漏。
EXC_BAD_ACCESS与取消引用解除分配的对象(或未初始化的对象)有关。你确定你初始化了'myDictionary'还是没有释放'myStruct'? – notnoop 2009-12-29 06:28:15
我已经更新了OP。请在“编辑”条目后查看 – 4thSpace 2009-12-29 07:53:46
请注意,如果使用ARC Objective-C对象在结构或联合中被禁止 – elitalon 2013-01-23 17:47:56