【发布时间】:2009-12-29 06:15:54
【问题描述】:
我已经定义了一个结构并且想要将它的一个值分配给一个 NSMutableDictionary。当我尝试时,我得到一个 EXC_BAD_ACCESS。代码如下:
//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,为什么字典会有这样的问题呢?
------------- 编辑 -------------
此编辑基于以下一些 cmets。
问题似乎出在结构内存分配中。正如其中一个 cmets 所述,我在 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 = 日期;
所以内存问题很可能在我发布格式化程序时出现。日期变量没有保留。我应该这样做吗
NSString *date = [[formatter stringFromDate:[NSDate date]] retain];
这确实有效,但我留下了内存泄漏。
【问题讨论】:
-
EXC_BAD_ACCESS 与取消引用已释放对象(或未初始化对象)有关。你确定你初始化了
myDictionary还是没有释放myStruct? -
我已经在这方面更新了 OP。请在“编辑”条目后查看
-
请注意,如果您使用 ARC,Objective-C 对象在结构或联合中是被禁止的
标签: iphone objective-c cocoa-touch struct