【问题标题】:Small Memory Issue with Objective-CObjective-C 的小内存问题
【发布时间】:2011-01-15 15:50:40
【问题描述】:

我制作了一个基本上运行 NSTask 的 Mac OS X 应用程序。问题是,我创建了一个名为 XXTask 的类来处理文件,并创建了一个名为 XXController 的类来处理 GUI 中的拖放,并要求 XXTask 不时处理文件。

我过去做过几乎相同的东西,而且效果很好。这次我加了一个委托协议,让XXController成为XXTask的委托。

当 XXTask 失败时,我要求委托显示一个特定的视图,从而调用这样的方法:

[delegate showView];

这可行,但是当尝试使用我在第一次启动时存储的信息重新启动时,应用程序会输出错误。我使用 NSLog 来查看到底出了什么问题,看起来三个实例变量(两个 NSString 和一个 NSMutableArray)是(null)。

这是三个实例变量:

NSString *curFilePath;
NSArray *lastArgs;
NSString *lastLaunchPath;

我是这样创建它们的:

curFilePath = filename; 
// filename is an NSString passed to the method where I first create curFilePath
// the object passed to the method is a retained NSString (an instance variable of XXController) 
lastArgs = [[NSMutableArray arrayWithObjects:curFilePath, [curFilePath stringByDeletingLastPathComponent], nil] retain];
lastLaunchPath = [[[NSBundle mainBundle] pathForResource:@"xxtask" ofType:@""] retain];

三个变量都为空,但 XXTask 对象不是,因为它仍然可以执行代码。

错误:

2011-01-15 16:38:57.233 App[24179:a0f] PATH : (null)
2011-01-15 16:40:52.846 App[24212:a0f] LAST ARGS : (null)
2011-01-15 16:40:52.847 App[24212:a0f] LAST LP : (null)
2011-01-15 16:40:52.847 App[24212:a0f] Exception detected while handling key input.
2011-01-15 16:40:52.848 App[24212:a0f] *** -[NSCFArray insertObject:atIndex:]: index (1) beyond bounds (1)

当我不通过调用委托来绘制视图时,一切都很好。我可以将该视图方法放在 XXTask 类中,但我宁愿先找到一个简洁的解释。当我打电话给代表时会发生什么? (这是我第一次尝试使用委托协议)

感谢您的回答!

如果你觉得这段代码很糟糕,我有两个借口:

  1. 我混了很久 时间,读取内存管理 文档并做了最愚蠢的事情。
  2. 引用计数内存管理对我来说是相当新的。我有 从来没有做过像这样真正的大应用 过去的一个,所以我通常不能 做错了很多,但这次记忆 更重要。

【问题讨论】:

  • 你能把错误粘贴到这个问题中吗?
  • 添加了我的三个 NSLogs 以显示对象为零,以及两个完全正常的错误,因为 XXLastArgs 为空(我正在使用 XXLastArgs 制作一个数组并向该数组添加一个对象,并且作为 XXLastArgs为 nil,这会输出错误)。
  • 请张贴@interfaces 的相关部分——很难猜测什么属于哪里... 您在哪里以及如何设置和连接委托关系?是不是你在 NSTask 失败后简单地处理了你的 XXTask 并通过某种延迟加载逻辑出错重新创建它?如果你的 ivars 被过度发布,你肯定会崩溃并且不会在那里看到 null ......

标签: objective-c macos memory-management delegates protocols


【解决方案1】:

如果我理解正确(没有任何代码很难),你会存储一些保存在 XXTask 中的信息,对吗?

您是否保留/复制数据?如果没有,它会在 XXTask 发布后立即发布。 如果我误解了你的问题,我要求你提供一些代码来证明你的问题。这使得查找错误变得更加容易。

【讨论】:

  • 我很想提供代码,但这并不容易。我不知道问题到底出在哪里,所以我不知道给你什么代码。我将编辑我的帖子以澄清一些事情。感谢您的回答!
猜你喜欢
  • 2011-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-11
  • 2011-03-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多