gpt4 book ai didi

objective-c - 泄露报告看似不相关的问题

转载 作者:行者123 更新时间:2023-12-03 16:27:53 25 4
gpt4 key购买 nike

我对 Cocoa 和 Objective-C 还很陌生。目前,我正在开发一个相当基本的应用程序来测试我的知识并将我一直在阅读的一些内容付诸实践。一切正常,但 Leaks 报告了一些问题。

这些泄漏似乎都不能直接适用于我编写的代码(我已阅读并尝试遵循 Apple 关于内存分配的规则)。目前我的项目使用垃圾收集,并且我正在 Snow Leopard 上进行开发。运行AnalysisTool发现我的代码没有任何问题(除了一些命名约定警告之外)。

目前,我的应用程序使用 NSTableView,我已将其连接到 NSArrayController。与 NSTableView 交互似乎会导致泄漏报告问题(例如对表列进行排序和其他标准用户交互等操​​作)。这让我相信我对 NSArrayController 的使用(以及我对其内容源的实现)是罪魁祸首。

目前,NSArrayController 从我的应用程序委托(delegate)中处理的 NSMutableArray(计时器)接收其内容,如下所示:

- (id) init
{
if (self = [super init])
{
timers = [NSMutableArray array];
}
return self;
}
- (void) dealloc
{
[timers release];
[super dealloc];
}

在 Interface Builder 中,我的 NSArrayController 将其对象 Controller 设置为 Timing 类,定义如下:

@interface Timing : NSObject {
NSString *desc;
NSDate *timestamp;
bool active;
}
@end

@implementation Timing
-(id) init
{
if (self = [super init])
{
desc = @"New timing";
timestamp = [[NSDate alloc] init];
active = false;
}
return self;
}
-(void) dealloc
{
[timestamp release];
[super dealloc];
}
@end

我使用标准 Cocoa 绑定(bind)来连接“添加”和“删除”按钮来操作 TableView,这些按钮似乎工作正常(例如,单击“添加”将在 TableView 中创建一行,其值为“新计时”)。

Leaks 报道称,负责的库是 AppKit 和 CoreGraphics。不过,老实说,我对 Leaks 工具还很陌生,所以我可能会错误地读取它的输出。如果有帮助,我已经放置了其输出的屏幕截图 here 。如果有人能指出我正确的方向,我将不胜感激。

顺便说一句,我还尝试过在不使用 Cocoa 绑定(bind)的情况下手动将对象添加到计时器数组中。这是我想到的:

Timing *timingInstance = [[Timing alloc] init];
[timers addObject:timingInstance];
[timingInstance release];

[timersController setContent:timers];
[timersTableView reloadData];

同样,这似乎有效,但我认为最好询问专家!

最佳答案

您对timers数组的内存管理完全不正确。使用 array 工厂方法将返回一个已自动释放的 NSMutableArray 实例,因此该对象的生命周期(可能)仅限于当前运行循环的末尾,并且当您在 dealloc 方法中调用 release 时,它将被过度释放。正确的做法如下:

- (id) init
{
if (self = [super init])
{
timers = [[NSMutableArray alloc] initWithCapacity:0];
}
return self;
}

此方法将为您提供一个保留计数为 1 的 NSMutableArray 实例,当您调用 release 时,该实例将降至零(并正确释放内存)在你的 dealloc 方法中。 init 方法中对 alloc 的调用通过 dealloc 方法中对 release 的调用来平衡。我注意到这正是您在 Timing 类中用于 NSDate 对象的模式,因此您已经熟悉了这个想法。

关于objective-c - 泄露报告看似不相关的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2677945/

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