gpt4 book ai didi

iphone - Objective-C 动态对象创建内存问题

转载 作者:行者123 更新时间:2023-12-03 21:07:48 25 4
gpt4 key购买 nike

一段时间以来,我的 iPhone 程序中一直遇到一个奇怪的问题。

长话短说:我有一个 XML,其中包含有关树状组合的数据。我编写了一个解析器,它从 XML 构造一棵树。

在 DataSource 类的某处我有以下方法:

 - (id)loadAllData {
if (self.doc != nil) {
GDataXMLElement *root = [self.doc rootElement];
Component *component = [Component componentWithRoot:root];
NSLog(@"%@", component);
return component;
}
return nil;
}

工厂方法如下所示:

+ (id)componentWithRoot:(GDataXMLNode*)element {
id<iComponent> component = nil;
NSString *clsName = [NSString stringWithFormat:@"%@Element", [element name]];

// Will return instance of a class or |nil| if class is not loaded.
Class cls = NSClassFromString(clsName);

if (cls != nil) {
component = [[cls alloc] init];

// dies on next line
NSLog(@"created %@", component);

// Seems that we have corresponding model class
if (component != nil) {

//... setting attrubutes for this model

//... trying to find child elements and add them to the component instance.
}
}
return component;
}

此外,当我在调用 allocinit 方法的地方停止 GDB 并尝试在调试器中调用它们时,我会看到下一个错误日志:

(gdb) po component

Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_INVALID_ADDRESS at address: 0x828282df
0x01052a67 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.

所以情况是:我的程序以某种方式启动并正确显示我需要的值。但是,当我尝试使用我的组件执行某些操作时,程序就会崩溃。有任何想法吗?我怎样才能找到错误?我不知道为什么 NSLog(@"created %@", component); 会导致应用程序崩溃,component 的其他操作也会崩溃(实际上我想将其编码为一个文件)。

提前致谢!

<小时/>

更新

这是一段带注释的工厂方法代码

+ (id)componentWithRoot:(GDataXMLNode*)element {
id<iComponent> component = nil;
NSString *clsName = [NSString stringWithFormat:@"%@Element", [element name]];
NSLog(@"%@", clsName);
// Will return instance of a class or |nil| if class is not loaded.
Class cls = NSClassFromString(clsName);
if (cls != nil) {
component = [[[cls alloc] init] autorelease];
// Seems that we have corresponding model class
if (component != nil) {

[component setTitle:[element name]];
/*
when I run app I have first element named ConfigElement.
Code runes fine to this point and even properties are set correct.
But if I set breakpoint at this line and type in consle
po component
I get message which is posted below
*/

(gdb)po组件

程序收到信号EXC_BAD_ACCESS,无法访问内存。原因:KERN_INVALID_ADDRESS,地址:0x828282dfobjc_msgSend () 中的 0x01052a67正在调试的程序在 GDB 调用的函数中收到信号。GDB 已将上下文恢复到调用之前的状态。要更改此行为,请使用“set unwindonsignal off”包含函数 (_NSPrintForDebugger) 的表达式的计算将被放弃。

由于发生这种情况,我想确保所有 init 方法都是正确的。这是我正在做的事情:

首先 - 检查类名是否为 ConfigElement - 是

第二 - 查看 ConfigElement init - 一切正常:

- (id)init {
self = [super init];
return self;
}

第三个 - 查看 super (Composite)初始值设定项:

- (id)init {
if ((self = [super init])) {
children_ = [[NSMutableArray alloc] init];
}
return self;
}

然后再次寻找 super 初始化程序(现在是Component初始化程序) - 看起来又很好:

- (id)init {
if ((self=[super init])) {
title_ = nil;
name_ = nil;
icon_ = nil;
parent_ = nil;
children_ = nil;
}
return self;
}

由于 Component 是 NSObject 的子类,我不需要再次担心 super 初始化程序,并且可能会删除 if 语句,但就这样吧。此外,所有这些初始化程序都是指定的,并且实际上是在 init 时调用的。

那么为什么我在 GDB 中收到该错误消息?

最佳答案

问题出在我的有缺陷的description方法中:

- (NSString*)description {
NSString *desc = [NSString stringWithFormat:@"Title: %@, Name: %@, Icon: %@, parent: %@, children: %@", self.title, self.name, self.icon, self.parent];
return desc;
}

修复此方法后,调试器开始打印正确的值。

关于iphone - Objective-C 动态对象创建内存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5553265/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com