gpt4 book ai didi

iphone - 在设备上找不到过度发布的对象调试

转载 作者:行者123 更新时间:2023-12-01 18:02:36 25 4
gpt4 key购买 nike

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

[locManager startUpdatingLocation]和-的开始

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

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

当我在[locManager startUpdatingLocation]之前和之后在线插入NSLog时,我的NSString对象已分配并存在。但是,当应用执行并命中locationManager时:NSLog显示NSString已释放,消失了。该字符串对象与位置处理或功能完全无关。不相关的NSString。我已经注释了所有其他潜在的 Activity ,并注释了所有显式的发布代码,但找不到发生的那一刻。

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

我正在使用Lion,Xcode 4.1.1和过多的咖啡。

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

最佳答案

曾几何时,我有一个复杂的案例来查找已发布的对象,因此我只是从该对象继承到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

我在这种方法中放置了一个断点,并在我预期崩溃的阶段将其打开。之后,我刚开始一个接一个地进行此 call ,发现了一个问题。它很复杂,但可能会有所帮助,而且我从未在论坛中看到过这种方法。也许它也会帮助您。

关于iphone - 在设备上找不到过度发布的对象调试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6990627/

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