Objective-C:有没有办法找出哪种对象驻留在特定的内存地址?

时间:2010-07-16 18:47:44

标签: objective-c memory-management

来自Java和Python,我对内存管理并不熟悉,但有没有办法找出哪种对象驻留在特定的内存地址?

我问,因为我的申请以一条含有以下内容的神秘信息终止:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSDecimalNumber encodedURLParameterString]: unrecognized selector sent to instance 0x164840'

并希望得到一些关于出错的线索。

如果无法做到这一点,我们将非常感谢这些错误消息的一些调试技术。

提前致谢!!

编辑:跟进关注(已移动HERE

在对我一直在使用的框架进行一些调查后,我发现了一些我不太了解的内容。

如果我有方法

- (void) myMethod:(NSString *)string {
    [Object anothermethodWithString:string];
}

我打电话

[Object myMethod:@"this is a string"];

我是否需要做类似

的事情
NSString *string2 = [[NSString alloc] initWithFormat:@"%@", string];
[Object anothermethodWithString:string2];
[string2 release];

而不是我之前使用myMethod的方式?似乎我通过我的方法的参数传递的字符串被释放到某个地方,并且这样做解决了我的问题。我想我真的不明白@“string”在内存方面究竟是什么。它是否像自动发布的NSString?

3 个答案:

答案 0 :(得分:4)

好吧,从错误中,该内存地址的对象类型是NSDecimalNumber。您收到错误,因为您在NSDecimalNumber上调用encodedURLParameterString,该NSDecimalNumber没有具有该名称的方法。

答案 1 :(得分:3)

在gdb中,您可以输入

po <address>

找出对象的描述如果它真的是一个Objective-C对象。

但在你的情况下,这听起来更像是你正在向已经解除分配的对象发送消息,这会给对象的类型带来错误的结果。尝试enable NSZombie来显示它实际上是什么类型的对象。

答案 2 :(得分:3)

这种类型的错误通常是由“悬空指针”引起的,这是在解除分配对象后保持指针引用的结果。如果在(现在为空)内存空间中实例化了另一个对象,并且随后通过悬空指针发送消息,则会出现类似于您观察到的错误。通过向encodedURLParameterString发送消息NSDecimalNumber会导致此特定错误。

struct objc_object实例的NSDecimalNumber的开头位于您认为引用的对象先前占用的内存位置这一事实并不重要。你真的关心悬挂引用的位置,以及为什么在你预期之前释放对象。您可以进行enable NSZombie跟踪,这会使已释放的对象保持活动状态,并在您尝试向其发送消息时在调试器中停止。您还可以从崩溃站点调查堆栈跟踪。上一个堆栈帧可能会指向您发送有问题的消息的位置,从而指向您使用的引用。

一旦确定了保留悬挂引用的位置,就应检查该引用是否被正确保留(以保持对象存活)。