Objective-C的小内存问题

时间:2011-01-15 15:50:41

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

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

我过去做过几乎一样的事情,并且工作得很好。这一次,我添加了一个委托协议,并使XXController成为XXTask的代表。

当XXTask失败时,我要求代理人显示一个特定的视图,然后调用这样的方法:

[delegate showView];

这样可行,但是当尝试使用我在第一次启动时存储的信息重新启动时,应用程序会输出错误。我使用NSLog来查看到底出了什么问题,看起来好像三个实例变量(两个NSStrings和一个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];

所有三个变量都是null,但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. 我已经玩弄了很长时间 时间,阅读内存管理 docs做了最愚蠢的事情。
  2. 引用计数内存管理对我来说很新鲜。我有 从来没有像这样真正的大型应用 一个过去,所以我通常不能 做了很多错,但这次是记忆 更重要的是。

1 个答案:

答案 0 :(得分:0)

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

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