1

我有一个相当大的应用程序,它在模拟器中工作,但在 iPhone 设备上的过度发布对象场景中创建。NSzombies 似乎是要走的路线,除了该对象在模拟器上没有过度释放并且 NSZombies 在设备上不起作用。通过数小时的日志记录,我似乎能够将它固定在我跑步之间的某个地方 -

[locManager startUpdatingLocation] 和开始 -

(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation

这就解释了为什么它可以在模拟器上运行,我没有检测到定位能力并且不运行该定位代码。

当我在 [locManager startUpdatingLocation] 之前和之后在线 NSLog 时,我的 NSString 对象被分配并存在。但是当应用程序执行并点击 locationManager: NSLog 显示 NSString 已被释放,消失了。这个字符串对象与位置处理或功能完全无关。不相关的 NSString。我已经注释掉了所有其他潜在的活动,并注释掉了所有明确的发布代码,但找不到它发生的那一刻。

我更沮丧的是 lldb 似乎不支持观察点而 gdb 支持它们,但这个版本似乎它们不起作用!gdb 将设置一个硬件观察点,然后 Xcode 说它正在运行,但 30 分钟后仍然没有视觉活动或中断。

我在 Lion、Xcode 4.1.1 和太多的咖啡上。

我应该采取什么方法在如此狭窄的活动范围和有限的工具中找到这个已发布的 NSString 对象?

4

2 回答 2

5

曾几何时,我有一个复杂的情况来定位释放的对象,所以我只是从这个对象继承到 MyObject 并以下列方式覆盖了一个保留和释放:

这是 DebugString.h 文件:

#import <Foundation/Foundation.h>

@interface DebugString : NSString

@end

这是 DebugString.m 文件:

#import "DebugString.h"

@implementation DebugString

- (id) retain {
    NSLog(@"%i", [self retainCount]);
    return [super retain];
}

- (void) release {
    NSLog(@"%i", [self retainCount]);
    [super release];
}

@end

我在这些方法中设置了一个断点,并在我预期会崩溃的阶段打开它们。之后我才开始一个一个地处理这个电话,发现了一个问题。它很复杂,但有时可能会有所帮助,而且我从未在论坛中看到过这种方法。也许它也会帮助你。

于 2011-08-09T02:03:32.260 回答
0

在模拟器中运行时手动调用位置“didUpdate” - 在启动位置管理器后至少两次调用,超时约五秒。这应该会触发与手机相同的错误,然后您可以使用 NSZombies。

此外,模拟器应该能够运行位置代码,我认为这在 4.2 中已损坏,但在 4.1 中可以。

于 2011-08-09T06:21:48.627 回答